将结构数组初始化为全0的最快方法?

TCS*_*rad 24 c structure initialization

我正在尝试使用以下语法将结构数组初始化为全0:

STRUCTA array[MAX] = {0};
Run Code Online (Sandbox Code Playgroud)

但是,我从gcc收到以下警告:

警告:初始化程序周围缺少大括号

我做错了什么 - 有另一种/更好的方法吗?

AnT*_*AnT 28

它的结构的第一个成员有一个标量类型,使用

STRUCTA array[MAX] = {{ 0 }};
Run Code Online (Sandbox Code Playgroud)

如果你的struct的第一个成员碰巧是另一个struct对象,其第一个成员有标量类型,那么你将不得不使用

STRUCTA array[MAX] = {{{ 0 }}};
Run Code Online (Sandbox Code Playgroud)

等等.基本上,{}每次"输入"另一个嵌套聚合(结构或数组)时,都必须打开一个新的嵌套级别.因此,在这种情况下,只要每个嵌套聚合的第一个成员也是聚合,您需要更深入{}.

所有这些额外的括号只是为了避免警告.当然,这只是一个无害的警告(在这个特定情况下).你可以使用简单的{ 0 },它会工作.

处理此问题的最佳方法可能是完全禁用此警告(请参阅@ pmg的正确命令行选项的答案).在海湾合作委员会工作的人没有想清楚.我的意思是,我理解该警告的价值(它确实非常有用),但破坏功能{ 0 }是不可接受的.{ 0 }应该给予特殊待遇.

  • @ shan23:我会说最干净的代码是`{0}`,它是C中的通用零初始化器.你的公司策略正在破坏C语言中最干净的习语之一(也是一个非常有用的习惯用语). (11认同)
  • +1我大多同意,我会说这不是公司政策,而是gcc政策就是问题.`-Wno-braces`实际上也禁用了其他*可能有用的*大括号相关的警告(比如`if if else`的东西),而gcc是完全错误的,并且不考虑在这方面特殊的通用零初始化器. (3认同)

pmg*_*pmg 8

gcc令人讨厌.它应该在没有警告的情况下接受.
试试这个

STRUCTA array[MAX] = {{0}};
Run Code Online (Sandbox Code Playgroud)

可以使用选项-Wmissing-braces或控制gcc行为-Wno-missing-braces.

-Wall启用此警告; 使用-Wall但不是缺少大括号-Wall -Wno-missing-braces


R..*_*R.. 5

这只是gcc发布的有害警告,我会禁用它-Wno-braces.{0}对于那些定义你的代码不应该知道的类型来说,它是一个非常有用的"通用零初始化器",并且gcc不鼓励它的使用对于追求好的代码是有害的.

如果gcc想要保留此警告,那么至少应该是特殊情况{0}并在这种情况下禁用警告.