首页 > 解决方案 > Clang-Tidy 关于未能初始化匿名联合的所有字段的警告是误报吗?

问题描述

我在 C++ 项目中有如下代码:

struct Foo {
  union {
    double d = 1.0;
    char c;
  };
};

当我通过 Clang-Tidy 运行它时,它警告我构造函数没有初始化字段c。但是,当我编译代码时,我没有看到任何有关此联合初始化的警告。

这段代码是否存在潜在的问题?还是来自 Clang-Tidy 的警告是可以安全忽略的误报?

标签: c++clang-tidy

解决方案


实际上,在该代码中,您无法初始化这两个变量。检查结构和联合初始化规则。编译器会沿着这条线抛出一些东西Error: only one non-static data member of a union may have a default member initializer。因此,您不仅可以忽略 Clang 警告,在这种特殊情况下也必须这样做。如果它是误报或 Clang 的错误,不能说,但它显然不应该抱怨这个,因为修复这个警告会阻止你的代码编译。

关于这些警告的更一般的说明。一个未初始化的变量本身不会破坏你的程序,直到你尝试做一些取决于变量值的事情,然后可能会发生很多事情,有些不好,有些未知,有些甚至可以正常工作。

通过显式初始化变量,您可以确保它处于一致且已知的状态,在使用它时不太可能导致您的程序中断(除非您传递给它的值使其如此)。如果您真的知道自己在做什么,或者它们只是没有意义(例如这个),请忽略这些警告,后果自负。


推荐阅读