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

时间:2011-03-25 15:52:16

标签: c initialization structure

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

STRUCTA array[MAX] = {0};

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

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

我做错了什么 - 还有其他/更好的方法吗?

7 个答案:

答案 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,这在所有情况下都有效(请参见上面的链接以获取详细说明)。