考虑以下 C 代码:
typedef struct abc {
int a[4];
int b;
int c;
} abc_t;
abc_t x = { 0 };
我发现将其与 gcc -c -Wall -Wextra -pedantic -std=c99
进行比较不会生成任何警告或错误消息。我的解释是0
表示成员 a
的初始值设定项。但是a
是一个数组,而不是一个标量。如果我替换 0
与 1
这会立即产生预期的警告消息:
warning: missing braces around initializer [-Wmissing-braces]
14 | abc_t x = { 1 };
| ^
| { }
C 标准中是否存在 { 0 }
的异常(exception)情况?总是被解释为将所有内容设置为零的初始值设定项? Common sources文档似乎没有讨论类型的明显不匹配(数组与标量)。
我知道初始化器不能为空,即 { }
不是有效的初始值设定项。
最佳答案
Why is {0} always a valid struct initializer?
因为语法允许。它允许省略初始化子聚合的大括号。
Is there some exception in the C standard that { 0 } is always interpreted as the initializer which sets everything to zero?
不,没有什么区别。文件范围内没有显式初始化的任何变量始终初始化为零或指向 NULL 的指针。引用见cppreference initialization .
唯一的区别是警告的存在和第一个数组元素的值。如果 = {0}
,第一个数组元素将显式初始化为零,其余数组元素和其余结构成员将隐式初始化为零。
如果 = {1}
,第一个数组元素将显式初始化为 1。其余的数组元素和其余的结构成员都隐式初始化为零。噢,你的编译器也恰好发出警告,这是“实现质量”的事情。
= {0}
是一种常见代码,程序员不关心大括号是否 checkout ,因此您的编译器是一个高质量的编译器,不想打扰他们忘记的程序员关于这种情况下的牙套。如果您希望编译器在这种情况下发出警告,您知道答案 - 资助您的编译器开发,创建功能请求和/或为社区做出贡献并实现类似 -Wmissing-braces-also-当零时
警告。
关于c - 为什么 {0} 始终是有效的结构初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63408168/