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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++为将(静态)const全局变量设置为另一个静态const变量而给出编译器错误相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

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

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

以上是关于C ++为将(静态)const全局变量设置为另一个静态const变量而给出编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

Sass集成常用

C fscanf 输入验证

c语言中怎么把一个数组清空

C++中new的用法

[C语言小白]简易扫雷程序

ios 库中的 Libxml