C++ 将(静态)const 全局变量设置为另一个静态 const 变量时出现编译器错误

标签 c++ c++11 compiler-errors clang compiler-warnings

如果您不小心将 const 全局变量设置为 C++ 中的另一个静态 const 变量(在不同的翻译单元中),clang 是否可能给出编译器错误。

由于该行为几乎未定义,因此检测是否意外执行此操作将非常有用。

编辑:我的问题与上面链接的问题不同,因为我正在寻找编译器警告/错误消息以强制我不要将任何静态全局变量分配给另一个静态变量。我基本上想被编译器强制避免整个惨败。我想知道这是否可能。

最佳答案

我不认为你可以自动抛出错误。 我遇到过这样的问题,这就是我为解决这些问题所做的工作。您可以添加一些在编译时设置为 false 的全局 bool globalStaticsDone 变量,并且在进入 main 时需要将该变量设置为 true。

然后,如果您怀疑在任何地方有一些代码被全局 ctors 调用,您可以使用 assert(globalStaticsDone)(或者如果您愿意,也可以使用 c++ throws)为其增添趣味,以捕获对这些代码的意外使用对象。然后,您去修复这些用途。

一般来说,在复杂的项目中这是一个常见的问题,其中一些非平凡的对象被创建为全局静态,并最终使用一些可能尚未初始化的其他全局变量。如果您的项目是跨平台的,并且目标平台上的编译和链接顺序不同,问题会变得更糟。例如,在 ios 和 android 构建上可能有这些差异:在这种情况下,它可能在一个构建上是未定义的行为,而在另一个构建上是正常的,从而导致一些神秘的错误。

作为替代方案,一些编译器可能会在调试版本中提供未初始化的读取检查。

关于C++ 将(静态)const 全局变量设置为另一个静态 const 变量时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102193/

相关文章:

c# - 矩阵分解

python - 在 C++ 中保存数据,从 Python 加载 - 推荐的数据格式

c++ - 为什么 clang++ 不编译以下代码?

C++如何直接调用类中定义的方法,其中仅对该类的引用由另一个函数返回

swift - 在 Swift 4 中退出 Firebase

使用 mpicc (MPICH2) 和 pthread_barrier (-lpthread) 编译

c++ - 重载运算符 !=

c++ - 创建new object()时如何调用基类构造函数new base(argC argV)?

pointers - C++11 lambda 中的“this”指针发生变化

c++ - 如何检测一个容器是否保证有序列存储