Sha*_*esh 3 c++ g++ name-mangling
请考虑以下C++程序:
int _Z5func2v;
void func2() {
}
Run Code Online (Sandbox Code Playgroud)
当您尝试编译它时,它会失败:
$ 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
Run Code Online (Sandbox Code Playgroud)
这是因为程序定义了一个全局变量,该变量与名称重整后的函数名称相同.
我可以想到很多方法可以解决这个问题,其中最简单的方法是在错位名称的开头使用两个下划线(两个下划线保留用于私有实现).
问题是:为什么选择的方案可以实现?
以单个下划线后跟大写字母开头的名称与包含两个下划线的名称保留的名称相同.
例如,根据2003 C++标准,第17.4.3.1.2节,"每个包含双下划线(__)的名称或以下划线后跟大写字母(2.11)开头,保留给实现用于任何用途."