为什么名称修改对C ++中的主要功能没有影响? [英] Why name-mangling has no effect on main function in C++?

查看:46
本文介绍了为什么名称修改对C ++中的主要功能没有影响?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C ++编译器经常修改函数名称以支持许多功能.程序员可以使用外部"C" 方式禁止默认名称处理.但是,为什么 int main(int,char **)从未受到影响?

C++ compiler often mangle function names to support many features. Programer can suppress default name-mangling using extern "C" way. However, why int main(int, char **) not affected ever?

// test.cpp

int max(int a, int b) {
    return a > b ? a : b;
}

extern "C" {
    int min(int a, int b) {
        return a < b ? a : b;
    }
}

int main (int argc, char *argv[]) {
    return 0;
}    

还有

$  xcrun --sdk macosx clang -x c++ -c test.cpp -o test  
$  xcrun nm -nm test  

0000000000000000 (__TEXT,__text) external __Z3maxii  
0000000000000030 (__TEXT,__text) external _min  
0000000000000060 (__TEXT,__text) external _main  

很明显, int max(int,int)被整形为 __ Z3maxii int min(int int)无需使用 extern"C" 批注进行修饰.

Obviously, int max(int, int) is mangled to __Z3maxii; int min(int int) is free from mangling with extern "C" annotation.

主要如何摆脱混乱?
除了上面的注释,还有什么方法可以防止名称被篡改吗?

How does main escape from mangling?
Is there any way else to keep name from mangling except the above annotation?

推荐答案

[basic.start.main]/1

程序应包含一个名为 main 的全局函数.[...] 此功能不应重载.[...]当在同一范围内为单个名称指定两个或多个不同的声明时,该名称被称为重载 [...].

A program shall contain a global function called main. [...] This function shall not be overloaded. [...] When two or more different declarations are specified for a single name in the same scope, that name is said to be overloaded [...].

这是未定义的行为,以使全局名称空间中具有名称为 main 的任何内容.这样,就没有理由粉碎 main 甚至认为它是适当的功能.

This is then undefined behavior to have anything in the global namespace with the name main. There is then no reason for an implementation to mangle main or even consider it to be a proper function.

这篇关于为什么名称修改对C ++中的主要功能没有影响?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆