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 }应该给予特殊待遇.
gcc令人讨厌.它应该在没有警告的情况下接受.
试试这个
STRUCTA array[MAX] = {{0}};
Run Code Online (Sandbox Code Playgroud)
可以使用选项-Wmissing-braces或控制gcc行为-Wno-missing-braces.
-Wall启用此警告; 使用-Wall但不是缺少大括号-Wall -Wno-missing-braces
这只是gcc发布的有害警告,我会禁用它-Wno-braces.{0}对于那些定义你的代码不应该知道的类型来说,它是一个非常有用的"通用零初始化器",并且gcc不鼓励它的使用对于追求好的代码是有害的.
如果gcc想要保留此警告,那么至少应该是特殊情况{0}并在这种情况下禁用警告.