【问题标题】:g++11 : getting rid of missing initializer for member 'A::<anonymous>'g++11 : 删除成员 'A::<anonymous>' 的缺失初始化程序
【发布时间】:2021-10-03 21:39:48
【问题描述】:

我即将发布一个代码,但我不希望其中包含任何警告。 目前正在使用-Wall -Wextra 寻找我能找到的一切。

现在我有了这个示例代码(非常人为的生产代码):

// Type your code here, or load an example.
#include <iostream>
#include <vector>
using namespace std;

struct A {
  union {
    int i = 82, j;
  };
  int a = 98, b = 22;
};

int main() {
  A p = {.a = 45};

  cout << p.a << endl; // just here to prevent optimization
  cout << p.i << endl; // same

  return 0;
}

可以在这里测试: Godbolt test case

我得到: 警告:缺少成员“A::”的初始化程序 [-Wmissing-field-initializers]

现在,真正的问题是,真正缺乏初始化可能会产生很多后果(想想现实生活中的损害)。

请注意,所有字段都有默认初始化。并且单元测试表明字段已正确初始化(运气?)

再一次,我对这个警告感到非常不舒服。

需要:

在生产代码中,结构足够大,我不愿意用这种表示法手动初始化所​​有成员(并且使用许多初始化策略,它很快就会变得难以忍受/容易出错)

我怎样才能设法使这个警告消失(再次考虑在缺乏初始化的情况下造成的损害),而不只是关闭-Wextra

更新:

我看到了其他相关问题,但考虑到风险,我真的很想深入了解这个特殊案例。

更新2:

阅读不同编译器的程序集,他们似乎采取了正确的行动,但只有 GCC 抱怨。

【问题讨论】:

    标签: c++ initialization g++ c++20


    【解决方案1】:

    对于问题:“我的所有字段都初始化了吗?”

    自从

    所有字段都有默认初始化

    答案是:是的

    来源:https://en.cppreference.com/w/cpp/language/aggregate_initialization

    部分:指定的初始化器 示例:

    struct A { int x; int y; int z; };
    A a{.y = 2, .x = 1}; // error; designator order does not match declaration order
    A b{.x = 1, .z = 2}; // ok, b.y initialized to 0
    

    struct A {
      string str;
      int n = 42;
      int m = -1;
    };
    A{.m=21}  // Initializes str with {}, which calls the default constructor
              // then initializes n with = 42
              // then initializes m with = 21
    

    现在,如何处理警告。我能想到的:

    1. 将所有初始化 => 代码添加到 big
    2. Disable locally the warning => 同样的问题
    3. 不要使用-Wall -Wextra,而是使用减号内的所有警告 -Wmissing-field-initializers 并在您的测试中添加带有 clang 完整警告和 -Werror 的构建。

    如果你的代码库不能用 clang 编译,我能想到的最后一件事是:做一个列出所有“不需要的警告”的脚本并运行你的构建,如果你有一个新的警告:修复它。它很丑,而且不能很好地扩展。

    【讨论】:

    • 感谢 Martin,我将继续检查程序集并依赖于初始化应该发生的事实。我也应该填写一份 gcc 错误报告,但我知道他们已经意识到了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多