47

通常用于{0}初始化 astruct或 anarray但考虑第一个字段不是标量类型的情况。如果 的第一个字段struct Person是另一个struct或数组,则此行将导致错误 ( error: missing braces around initializer)。

struct Person person = {0};

至少 GCC 允许我使用一个空的初始化列表来完成同样的事情

struct Person person = {};

但这是有效的 C 代码吗?

另外:这条线是否保证给出相同的行为,即零初始化struct

struct Person person;
4

2 回答 2

53

不,不允许空的初始化列表。GCC 也可以在编译时显示-std=c99 -pedantic

a.c:4: warning: ISO C forbids empty initializer braces

原因是语法在2011 ISO C 标准的 §6.7.9 中定义的方式:

initializer:
         assignment-expression
         { initializer-list }
         { initializer-list , }
initializer-list:
         designation(opt) initializer
         initializer-list , designation(opt) initializer

根据该定义,初始化器列表必须至少包含一个初始化器。

于 2013-07-11T09:30:35.960 回答
7

根据 C99 标准,禁止使用空初始化列表创建数组。在上一个答案中,您可以看到语法没有描述这种情况。


但是如果你声明一个没有初始化的数组会发生什么?好吧,这取决于您使用的编译器。让我们看一下这个简单的例子:int arr[5] = {}.

海合会

默认情况下,当您尝试编译此代码时gcc不会产生任何警告/错误。甚至没有-Wall,但-Wpedantic确实如此。

warning: ISO C forbids empty initializer braces

但无论如何gcc,用 0 填充数组的成员,就像您明确指定它一样,int arr[5] = {0}请参阅程序集输出godbolt

但默认不显示有关这种情况的警告,但使用选项-Wgnu-empty-initializer会:

warning: use of GNU empty initializer extension

Clang 生成不同的汇编代码Godbolt但行为相同。

于 2019-01-28T20:20:21.683 回答