如果你不小心将一个const全局变量设置为C ++中的另一个静态const变量(在不同的翻译单元中),clang是否有可能给出编译器错误。
由于行为几乎未定义,因此检测是否意外执行此操作非常有用。
编辑:我的问题与上面链接的问题不同,因为我正在寻找编译器警告/错误消息,迫使我不要将任何静态全局变量分配给另一个静态变量。我基本上希望被编译器强制避免整个惨败。我想知道这是否可能。
我不认为你可以自动抛出错误。我遇到过类似的问题,而这就是我为解决这些问题所采取的措施。您可以在编译时添加一些设置为false的全局bool globalStaticsDone
变量,并且在输入main
时,您需要将该变量设置为true。
然后,如果你怀疑从全局ctors调用了任何地方的代码,你可以使用assert(globalStaticsDone)
(或者如果你愿意抛出c ++)来捕获它们以捕获这些对象的意外用法。然后,你去修复这些用途。
通常,在复杂项目中,这是一个常见问题,其中一些非平凡对象被创建为全局静态,并最终使用一些可能尚未初始化的其他全局变量。如果您的项目是跨平台的,并且目标平台上的编译和链接顺序不同,则问题会变得更糟。例如,在ios和android版本上可能存在这些差异:在这种情况下,它可能是一个构建上的未定义行为,而另一个构建上的ok可能导致一些神秘错误。
作为替代方案,一些编译器可能会在调试版本中提供未初始化的读取检查。