我正在尝试使用以下语法将结构数组初始化为全0:
STRUCTA array[MAX] = {0};
但是,我从gcc收到以下警告:
警告:初始化程序周围缺少大括号
我做错了什么 - 还有其他/更好的方法吗?
答案 0 :(得分:28)
你的struct的第一个成员有一个标量类型,使用
STRUCTA array[MAX] = {{ 0 }};
如果你的struct的第一个成员碰巧是另一个struct对象,其第一个成员有标量类型,那么你将不得不使用
STRUCTA array[MAX] = {{{ 0 }}};
等等。基本上,每次“输入”另一个嵌套聚合(结构或数组)时,都必须打开一个新级别的嵌套{}
。因此,在这种情况下,只要每个嵌套聚合的第一个成员也是聚合,您需要更深入地使用{}
。
所有这些额外的括号只是为了避免警告。当然,这只是一个无害的警告(在这个特定情况下)。您可以使用简单的{ 0 }
,它会起作用。
处理此问题的最佳方法可能是完全禁用此警告(请参阅@pmg的正确命令行选项的答案)。在海湾合作委员会工作的人没有想清楚。我的意思是,我理解该警告的价值(它确实非常有用),但打破{ 0 }
的功能是不可接受的。 { 0 }
应该得到特殊待遇。
答案 1 :(得分:8)
gcc令人讨厌。它应该在没有警告的情况下接受 试试这个
STRUCTA array[MAX] = {{0}};
可以使用选项-Wmissing-braces
或-Wno-missing-braces
控制gcc行为。
-Wall
启用此警告;要-Wall
而不是缺少大括号,请使用-Wall -Wno-missing-braces
答案 2 :(得分:5)
这只是gcc发出的有害警告,我会用-Wno-braces
禁用它。 {0}
是一个非常有用的“通用零初始化器”,用于定义你的代码不应该知道的类型,而gcc不鼓励使用它对于追求好的代码是有害的。
如果gcc想要保留此警告,则至少应该是特殊情况{0}
,并在这种情况下禁用警告。
答案 3 :(得分:1)
使用大括号初始化数组,但结构也是如此。您可能需要在0周围添加一组额外的括号,并且根据STRUCTA
的定义方式,用逗号分隔一些额外的0。
答案 4 :(得分:1)
这取决于STRUCTA。例如:
typedef struct structa
{
int a, b;
} STRUCTA;
int main (int argc, char const* argv[])
{
STRUCTA array[10] = {{0,0}};
return 0;
}
答案 5 :(得分:0)
STRUCTA可以分配到0吗?
您也可以随时使用memset()。
答案 6 :(得分:0)
您可以通过使用完全空的括号来避免该警告:
STRUCTA数组[10] = {};
该数组将为aggregate-initialized,这意味着其中的每个结构将依次为value-initialized。括号内的值初始化变成每个结构的aggregate-initializion,它将所有字段设置为0,这就是您想要的。
只要您的结构是POD,这在所有情况下都有效(请参见上面的链接以获取详细说明)。