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

时间:2012-07-18 23:42:59

标签: 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};

8 个答案:

答案 0 :(得分:37)

这是GCC错误#53119:

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

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

答案 1 :(得分:26)

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

static pkt_t stats = {{0}};

外部大括号用于结构,内部大括号用于数组。然而,还有许多其他方法可以给这只猫留下皮肤。 (例如,静态已经初始化为零)

答案 2 :(得分:7)

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

static pkt_t stats;

答案 3 :(得分:4)

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

答案 4 :(得分:1)

设置此gcc编译器标志: -Wno缺失-括号

答案 5 :(得分:0)

来自“info gcc”

  

作为GNU扩展,GCC允许通过复合文字初始化具有静态存储持续时间的对象(这在ISO C99中是不可能的,因为初始化器不是常量)。如果复合文字和对象的类型匹配,则处理就像对象仅使用括号括起来的列表初始化一样。复合文字的初始化列表必须是常量。如果正在初始化的对象具有未知大小的数组类型,则大小由复合文字大小确定。

 static struct foo x = (struct foo) {1, 'a', 'b'};
 static int y[] = (int []) {1, 2, 3};
 static int z[] = (int [3]) {1};
  

以上几行等同于:

 static struct foo x = {1, 'a', 'b'};
 static int y[] = {1, 2, 3};
 static int z[] = {1, 0, 0};

您可以将这些初始值设定项组合在一起,以允许对阵列进行特定于gcc的初始化,而无需指定数组中的每个元素。或者......您可以设置一个标志并在必要时在运行时初始化它,或者......您可以发现变量是否在BSS中并且可以自动归零(这是在函数或全局内存中的堆栈上) )。

答案 6 :(得分:0)

#define FRAME_TYPE_MAX 3

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 stats1= { .incoming={5,6,20},
                       .outgoing={0,0,0},
                       .timeouts=0,
                       .crc_errors=0
                       };

static pkt_t stats2= { {5,6,20},
                       {0,0,0},
                       0,
                       0
                       };

static pkt_t stats3= {{0}};

pkt_t stats4 ;   // global


int main(void)
{

    stats1.incoming[0]= 35;
    stats1.timeouts=25;
    stats2.incoming[2]=10;  
    stats3.outgoing[2]=10;  
    stats4.timeouts=10;
    for (;;);
    }

答案 7 :(得分:0)

如果您仍然对gcc版本感到高兴,而该gcc版本省略了这个错误警告,在问题中使用这样的结构,您可以通过这样的简单重构来避免此问题:

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

static pkt_t stats = {0};