C++ 给出编译器错误,将一个(静态)常量全局变量设置为另一个静态常量变量
C++ Give compiler error for setting a (static) const global variable to another static const variable
如果您不小心将 const 全局变量设置为 C++ 中的另一个静态 const 变量(在不同的翻译单元中),clang 是否有可能给出编译器错误。
由于行为几乎未定义,因此检测是否意外执行此操作将非常有用。
编辑:我的问题与上面链接的问题不同,因为我正在寻找编译器警告/错误消息,以迫使我不要将任何静态全局变量分配给另一个静态变量。我基本上想被编译器强迫以避免整个惨败。我想知道这是否可能。
我认为你不能自动抛出错误。 我遇到了这样的问题,这是我为解决这些问题所做的。您可以添加一些在编译时设置为 false 的全局bool globalStaticsDone
变量,并且在进入main
时,您需要将该变量设置为 true。
然后,如果你怀疑在任何地方都有一些代码被全局 ctors 调用,你可以用assert(globalStaticsDone)
(或者 c++ 抛出,如果你愿意的话)来捕捉这些对象的意外使用。然后,你去修复这些用途。
通常,在复杂项目中,这是一个常见问题,其中一些非平凡的对象被创建为全局静态,并最终使用一些可能尚未初始化的其他全局。如果您的项目是跨平台的,并且目标平台上的编译和链接顺序不同,则问题会变得更糟。例如,在ios和android版本上可能存在以下差异:在这种情况下,它可能在一个构建上未定义的行为,而在另一个构建上是ok,从而导致一些神秘的错误。
作为替代方法,某些编译器可能会在调试版本中提供未初始化的读取检查。
相关文章:
- 私有类型的静态常量成员
- 分离一个静态常量 std::thread?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 如何为静态常量模板化专用整数值分配存储
- 使用什么代替"静态常量 TCHAR *"
- C++ 模板中的静态常量初始化顺序
- 如何在编译时解析静态常量 std::string?
- 关于静态常量数据模因的声明和定义的混淆
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 为什么在第二类中使用静态常量会在第一类中给出编译器错误?
- 静态常量与常量局部变量,哪一个性能更好
- 如何在模板类中设置静态常量变量
- public:静态常量字符串声明/初始化问题
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 对静态常量积分类型的未定义引用
- 全局变量中的静态常量与常量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 避免在静态常量类上定义但不使用
- 指向静态常量对象的共享指针?