c++ - 全局 const 变量的 G++ 名称修饰

标签 c++ c gcc g++ name-mangling

有人可以帮助我理解 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

这表明编译器只会破坏位于只读部分的全局变量。我希望编译器要么破坏所有全局变量,要么不破坏全局变量

这是有意为之的行为吗?对我来说,它看起来不一致。

最佳答案

Mangling 主要用于区分否则会发生合理冲突的链接器符号。

由于 x 是隐式静态的,多个翻译单元可以合法地拥有不同的变量,所有变量都称为 x,因此符号被破坏以避免冲突。

由于y不是静态的,所以程序中只能有一个名为y的全局变量,所以没有必要避免冲突(它们应该被标记为 ODR 违规或由链接器删除重复数据)。

另一个用途是用于函数,以区分具有相同名称但不同参数列表的重载。这显然不适用于此处。

关于c++ - 全局 const 变量的 G++ 名称修饰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17064471/

相关文章:

c - 在 Ubuntu Mate 上编译的 GTK+ 程序显示空白窗口

c++ - 不同网络之间的socket编程

c++ - 主包含文件 - 好的或坏的做法

c++ - 如何在Processing中制作旋转摄像机?

c - C 中的类型转换错误

iphone - 是否可以使用来自非 Apple 操作系统的兼容 LLVM IR/位码来定位 iPhone?

c++ - GCC:编译成与代码明确对应的程序集?

c - 使用 union 时 .c include 文件中出现多个错误

C++:我在使用类搜索 vector 中的特定元素时得到了错误的结果

c++ - 类声明后编译错误,Main 没有 "see"类