c - 为什么 {0} 始终是有效的结构初始值设定项?

标签 c struct initializer

考虑以下 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是一个数组,而不是一个标量。如果我替换 01这会立即产生预期的警告消息:

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/

相关文章:

c - 如何定义包含指向自身的指针的 typedef 结构?

c - 如果用空值初始化的结构占用空间

c - 在声明时初始化 union 数组

创建 struct c 数组

c - PLT Racket 中的 FFI 与 openCV

c - 在调整 bmp 图像大小的程序中,这是什么意思?

将希腊单词转换为大写

c - 如何将多个结构数组传递给 C 中的单个函数

swift - 如何满足包含初始值设定项的协议(protocol)?

来自其他文件的 C++ 初始化程序列表