gpt4 book ai didi

c++ - 为什么 name-mangling 对 C++ 中的 main 函数没有影响?

转载 作者:太空狗 更新时间:2023-10-29 19:45:16 30 4
gpt4 key购买 nike

C++ 编译器经常会混淆函数名称以支持许多功能。程序员可以使用 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;
}

$  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) 被分解为 __Z3maxiiint min(int int) 不受 extern "C" 注释的影响。

main是如何逃脱mangling的?
除了上面的注释,还有什么方法可以防止名称被破坏吗?

最佳答案

根据 [basic.start.main]/1 , [basic.start.main]/2[over]/1 :

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 甚至认为它是一个正确的函数。

关于c++ - 为什么 name-mangling 对 C++ 中的 main 函数没有影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53393585/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com