Why name-mangling has no effect on main function in C++?

  • A+

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   

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?


Per [basic.start.main]/1, [basic.start.main]/2 and [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 [...].

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.


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: