为什么 Linux 上的 C++ 处理不是唯一的

Why is the C++ mangling on Linux not unique

请考虑以下 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

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

我能想到很多解决这个问题的方法,其中最简单的是在损坏名称的开头使用两个下划线(两个下划线保留供私有实现使用)。

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

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

例如,来自 2003 C++ 标准,第 17.4.3.1.2 节,"Each name that contains a double underscore (__) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use."