32

我在下面的 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};
4

8 回答 8

40

这是 GCC 错误 #53119:

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

如果您希望看到它已修复,请在错误报告中发布后续内容,表明这对您来说是个问题。

于 2012-07-19T00:37:14.200 回答
28

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

static pkt_t stats = {{0}};

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

于 2012-07-19T00:06:27.730 回答
7

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

static pkt_t stats;
于 2012-07-18T23:56:17.890 回答
4

One way is to initialize every member of the struct inside the braces, rather than relying on the implicit zero filling. For array members, you need another {} which is likely causing the warning. Another is to just disable the warning, though this isn't recommended as it can also catch legitimate bugs.

于 2012-07-18T23:50:13.143 回答
1
#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 (;;);
    }
于 2016-11-17T18:20:15.847 回答
1

设置这个 gcc 编译器标志:-Wno-missing-braces

于 2015-10-02T23:57:15.310 回答
1

如果您仍然对忽略此错误警告的 g​​cc 版本感到高兴,那么在问题中使用这样的结构,您可以通过一些简单的重组来避免这个问题,如下所示:

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};
于 2017-10-16T09:02:36.410 回答
0

来自“信息 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 中并且可能会自动归零(这是在函数的堆栈上还是在全局内存中)。

于 2012-07-18T23:58:55.860 回答