为什么Linux上的C ++混乱不是唯一的

时间:2019-01-11 05:09:47

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

请考虑以下C ++程序:

int _Z5func2v;

void func2() {
}

当您尝试编译它时,它会失败:

$ g++ test.cpp -c
/tmp/cc1RDxpU.s: Assembler messages:
/tmp/cc1RDxpU.s:13: Error: symbol `_Z5func2v' is already defined
/tmp/cc1RDxpU.s: Error: .size expression for _Z5func2v does not evaluate to a constant

这是因为程序定义了一个全局变量,该变量的名称与函数处理名称后得到的名称相同。

我可以想到许多解决方法,最简单的方法是在整齐的名称开头使用两个下划线(两个下划线保留供私有实现使用)。

问题是:为什么选择一种方案使之成为可能?

1 个答案:

答案 0 :(得分:8)

以单个下划线后跟一个大写字母开头的名称的保留方式与包含两个下划线的名称相同。

例如,从2003 C ++标准的17.4.3.1.2节,“每个名称包含双下划线(__)或以下划线后跟大写字母的开头(2.11)保留给实现以供任何使用。”