我有这样的结构在下面,我想初始化所有零℃。 如何摆脱失踪括号警告?
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};
我有这样的结构在下面,我想初始化所有零℃。 如何摆脱失踪括号警告?
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};
这是GCC的bug#53119:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119
如果你想看到它固定的,张贴随访,以表明它是一个问题为你的错误报告。
由于在结构中的第一个成员是一个数组,你需要:
static pkt_t stats = {{0}};
外括号是对于该结构,内括号是用于阵列。 不过,也有许多其他方法对皮肤这只猫。 (例如,静已经init'ed为零)
如果它是一个全局变量或局部静态的,它会自动初始化。 所以,简单地说:
static pkt_t stats;
一种方法是该结构的每个成员初始化括号内,而不是依赖于隐含零填充。 对于数组成员,则需要另外{}这很可能导致警告。 另一种是只禁用警告,但不建议这样做,因为它也能赶上合法错误。
设置这个gcc编译标志:-Wno-失踪括号
从“信息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与否,并且可以自动归零(这是在函数或在全局内存堆栈上)。
#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 (;;);
}
如果您仍然有喜悦是在其省略了这个假警告一个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};