如果您不小心将 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/