我在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};
答案 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};