c++ - 为什么 Linux 上的 C++ 重整不是唯一的

标签 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

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

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

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

最佳答案

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

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

关于c++ - 为什么 Linux 上的 C++ 重整不是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54140659/

相关文章:

c# - 从头开始——我应该使用 (MS Visual Studio) C# 还是 (MS Visual Studio) C++?

c++ - IEEE 浮点与自定义浮点性能

c++ - 使用子模块应用程序编译 Modular Boost 1.55.0

c++ - 如何自动从未修饰的stdcall DLL生成导入库?

c++ - 模板类并将数组初始化为零

c++ - 非类型模板函数重载问题

c++ - 免费的 Pascal/C++ 项目在 cout::sentry 中崩溃

c++ - 合理支持的最低 GCC 版本是多少?

c - 全局静态/非静态变量如何在 c 中被破坏?

c++ - Mingw 的处理/导出问题