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

C++ Give compiler error for setting a (static) const global variable to another static const variable

本文关键字:静态 常量 一个 设置 变量 另一个 全局变量 编译器 错误 C++      更新时间:2023-10-16

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

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

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

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

然后,如果你怀疑在任何地方都有一些代码被全局 ctors 调用,你可以用assert(globalStaticsDone)(或者 c++ 抛出,如果你愿意的话)来捕捉这些对象的意外使用。然后,你去修复这些用途。

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

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