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

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

STRUCTA array[MAX] = {0}; 

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

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

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

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

 STRUCTA array[MAX] = {{ 0 }}; 

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

 STRUCTA array[MAX] = {{{ 0 }}}; 

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

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

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

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

 STRUCTA array[MAX] = {{0}}; 

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

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

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

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

数组用大括号初始化,但结构也是如此。 您可能需要在0周围添加一组额外的括号,并且根据STRUCTA的定义方式,用逗号分隔一些额外的0。

这取决于STRUCTA。 例如 :

 typedef struct structa { int a, b; } STRUCTA; int main (int argc, char const* argv[]) { STRUCTA array[10] = {{0,0}}; return 0; } 

STRUCTA可以分配到0吗?

您也可以随时使用memset()。