GCC在初始化程序周围缺少括号

fre*_*set 28 c gcc gcc-warning

我在C中有这个结构,我想初始化为零.如何摆脱缺失的括号警告?

typedef struct {
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
    uint32_t timeouts;
    uint32_t crc_errors;
} pkt_t;

static pkt_t stats = {0};
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 38

这是GCC bug#53119:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119

如果您想要修复它,请在错误报告中发布后续信息,表明这对您来说是个问题.

  • 然而,似乎可以重新排序struct成员,以便第一个成为标量,并且警告消失.当您需要重新解释例如内存映射设备寄存器时,这不是一个选项,但在大多数情况下,这可能被视为一种解决方法. (2认同)
  • 据报道,GCC错误已得到修复。不知道该修复程序是否已经发布。 (2认同)
  • @DevNull:它不会影响代码的编译方式。相反,它会影响代码的编写方式,即人们要么编写不可移植的构造(`{}`),要么编写“正确”数量的嵌套级别以匹配特定版本的结构定义,以使警告消失. 导致人们编写*更糟糕的代码* 以抑制警告的警告是编译器可能具有的一些最有害的警告。 (2认同)

Jos*_*itt 26

由于结构中的第一个成员是您需要的数组:

static pkt_t stats = {{0}};
Run Code Online (Sandbox Code Playgroud)

外部支撑用于结构,内部支撑用于阵列.然而,还有许多其他方法可以给这只猫留下皮肤.(例如,静态已经初始化为零)

  • IDK,没有非静态模块变量? (2认同)

Kar*_*ath 7

如果它是全局变量或本地静态变量,它会自动初始化.所以,简单地说:

static pkt_t stats;
Run Code Online (Sandbox Code Playgroud)


Ant*_*ony 4

一种方法是初始化大括号内结构体的每个成员,而不是依赖隐式零填充。对于数组成员,您需要另一个可能会导致警告的 {}。另一种方法是禁用警告,但不建议这样做,因为它也可以捕获合法的错误。