c++ - Clang-Tidy 关于未能初始化匿名联合的所有字段的警告是误报吗?
问题描述
我在 C++ 项目中有如下代码:
struct Foo {
union {
double d = 1.0;
char c;
};
};
当我通过 Clang-Tidy 运行它时,它警告我构造函数没有初始化字段c
。但是,当我编译代码时,我没有看到任何有关此联合初始化的警告。
这段代码是否存在潜在的问题?还是来自 Clang-Tidy 的警告是可以安全忽略的误报?
解决方案
实际上,在该代码中,您无法初始化这两个变量。检查结构和联合初始化规则。编译器会沿着这条线抛出一些东西Error: only one non-static data member of a union may have a default member initializer
。因此,您不仅可以忽略 Clang 警告,在这种特殊情况下也必须这样做。如果它是误报或 Clang 的错误,不能说,但它显然不应该抱怨这个,因为修复这个警告会阻止你的代码编译。
关于这些警告的更一般的说明。一个未初始化的变量本身不会破坏你的程序,直到你尝试做一些取决于变量值的事情,然后可能会发生很多事情,有些不好,有些未知,有些甚至可以正常工作。
通过显式初始化变量,您可以确保它处于一致且已知的状态,在使用它时不太可能导致您的程序中断(除非您传递给它的值使其如此)。如果您真的知道自己在做什么,或者它们只是没有意义(例如这个),请忽略这些警告,后果自负。
推荐阅读
- reactjs - React useState 钩子没有显示正确的数组状态
- haskell - Debug GHC 编译错误在运行时由提示的 `Language.Haskell.Interpreter.runInterpreter` 返回
- unity3d - Rider 似乎不认识 Unity 项目
- java - 是否有一种简单的方法可以仅使用 SceneBuilder 在 JavaFX 中设置随窗口大小而增长/缩小的图像?
- node.js - 远程调试 node.js 应用,Chrome DevTools 检查设备丢失
- php - 在 cPanel 帐户中一起运行 PHP 和 Nodejs 应用程序
- windows - 选择字符串命令中两次选择的原因
- powerquery - 从 x 位长的列中获取数字
- c++ - 如果变量和函数在头文件中声明为内联,那么包含保护是否多余?
- kotlin - KMutableProperty 与和