Han*_*len 3 c++ program-entry-point name-mangling
C++编译器经常破坏函数名称以支持许多功能.Programer可以使用extern"C"方式抑制默认名称修改.但是,为什么int main(int, char **)不受影响呢?
// 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;
}
Run Code Online (Sandbox Code Playgroud)
和
$ 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
Run Code Online (Sandbox Code Playgroud)
显然,int max(int, int)被篡改了__Z3maxii; int min(int int)没有外部"C"注释.
主力如何摆脱重整?
除了上面的注释之外,还有什么方法可以保持名称不受损坏吗?
每[basic.start.main]/1,[basic.start.main]/2并且[over]/1:
程序应包含一个名为的全局函数
main.[...]此功能不应过载.[...]当在同一范围内为单个名称指定了两个或更多不同的声明时,该名称被称为过载 [...].
然后,这是未定义的行为,以在名称的全局命名空间中包含任何内容main.因此,没有理由将实现变形main,甚至认为它是一个合适的功能.
名称修改是C++编译器使用的一个过程,它为程序中的每个函数赋予唯一的名称.在C++中,程序通常至少有几个具有相同名称的函数,即函数重载,但是Main是特殊的,它实际上是C语言的全局函数,永远不会被重载,所以它不是必需的.
请查看https://en.cppreference.com/w/cpp/language/main_function
(主要)特殊属性
它无法预定义且无法重载:实际上,全局命名空间中的名称main是为函数保留的(尽管它可用于命名类,名称空间,枚举和非全局命名空间中的任何实体,但函数除外)在任何命名空间中都不能用C语言链接声明名为"main"(自C++ 17开始))