有人可以帮我理解gcc名称修改惯例吗?
考虑以下测试代码
#include <stdio.h>
const int x = 42;
int y = 42;
int main( int argc, const char* argv[] )
{
return 0;
}
运行nm
时,我得到以下(令人惊讶的?)结果:
0000000000000000 T main
0000000000000000 D y
0000000000000000 r _ZL1x
这表明编译器只会破坏放在只读部分中的全局变量。我希望编译器能够破坏ALL或NO全局变量
这是预期的行为吗?对我来说,它看起来不一致。
答案 0 :(得分:3)
Mangling主要用于区分链接符号,否则这些符号会合理地发生冲突。
由于x
是隐式静态的,因此多个翻译单元可以在法律上拥有所有称为x
的不同变量,因此该符号会被修改以避免冲突。
由于y
不是静态,程序中只能有一个名为y
的全局变量,所以不需要避免冲突(它们应该被标记)作为ODR违规或链接器重复删除。)
另一个用途是用于函数,以区分具有相同名称但不同参数列表的重载。这显然不适用于此。