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

时间:2018-03-05 01:08:53

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为你不能自动抛出错误。 我遇到过类似的问题,而这就是我为解决这些问题所采取的措施。您可以在编译时添加一些设置为false的全局bool globalStaticsDone变量,在输入main时,您需要将该变量设置为true。

然后,如果你怀疑从全局ctors调用了任何地方的某些代码,你可以使用assert(globalStaticsDone)(如果你愿意,可以使用c ++)来捕获这些对象的意外用法。然后,你去修复这些用途。

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

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