用最快的方式将一个结构体数组初始化为全0?

30

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

STRUCTA array[MAX] = {0};

然而,我从gcc得到了以下警告:

警告:初始化缺少花括号

我做错了什么 - 是否有其他/更好的方法来解决这个问题?


1
这个对你有帮助吗?https://dev59.com/0HVC5IYBdhLWcg3wtzut(看第二个答案) - rlb.usa
@RedX - STRUCTA只是一个随机的例子...任何结构都会抛出这个错误 - 我不能透露确切的结构,因为它是公司代码 :) - TCSGrad
7个回答

37

如果您的结构体的第一个成员是标量类型,请使用

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

如果你的结构体的第一个成员恰好是另一个结构体对象,其第一个成员具有标量类型,那么你就必须使用

STRUCTA array[MAX] = {{{ 0 }}};
基本上,每当您“进入”另一个嵌套聚合(结构体或数组)时,都必须打开一级新的嵌套{}。因此,在这种情况下,只要每个嵌套聚合的第一个成员也是聚合,您就需要使用{}更深层次。

所有这些额外的大括号只是为了避免警告。当然,在这种特定情况下,这只是一个无害的警告。您可以使用简单的{ 0 }就可以正常工作。

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


无法禁用警告......这是公司政策,我必须说它会导致更干净的代码!! - TCSGrad
14
我认为在C语言中最干净的代码是{ 0 },它是通用的零初始化器。你公司的政策正在破坏C语言中最干净、最有用的惯用法之一。 - AnT stands with Russia
3
我大致同意,我认为问题不在公司政策上,而在于gcc的政策。实际上,“-Wno-braces”也会禁用其他可能有用的括号相关警告(比如“if if else”之类的),gcc在这方面没有考虑到通用零初始化程序是特殊的,这是错误和愚蠢的。 - R.. GitHub STOP HELPING ICE

9

gcc很烦人。它应该接受没有警告的代码。
尝试这个。

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

那个gcc行为可以通过选项-Wmissing-braces-Wno-missing-braces来控制。 -Wall启用此警告;要使用-Wall但不需要缺少括号,请使用-Wall -Wno-missing-braces

5

这只是gcc发出的一个有害警告,可以使用-Wno-braces来禁用它。 {0}是一种非常有用的“通用零初始化器”,适用于您的代码不应该了解其定义的类型,并且gcc阻止其使用会对编写优质代码造成积极的不良影响。

如果gcc想保留此警告,至少应针对{0}进行特殊处理,在这种情况下禁用警告。


2
您可以通过使用完全空的大括号来避免警告:
STRUCTA array[10] = {};
该数组将被聚合初始化,这意味着其中的每个结构体将依次值初始化。使用空括号进行值初始化会变成每个结构体的聚合初始化,它会将所有字段设置为0,这正是您想要的。
只要您的结构体是POD(请参阅上面的链接以获取精确描述),这种方法在所有情况下都有效。

1

这取决于STRUCTA。例如:

typedef struct structa 
{
    int a, b;
} STRUCTA;

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

1

数组使用大括号进行初始化,但结构体也是如此。您可能需要在0周围再加上一组额外的大括号,并根据STRUCTA的定义情况,在逗号分隔的一些额外0之间添加。


0

STRUCTA 可以被赋值为 0 吗?

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


看看上面Rumple Stiltskin的例子。那就是我想要表达的。如果STRUCTA不能直接分配给{0},那么gcc就不会让你这样做。但是memset会盲目地这样做。 - tamarintech
1
首先,这不是赋值,而是初始化。其次,在 C 语言中,任何结构体(或数组)都可以用 {0} 进行初始化。 - AnT stands with Russia
类似于 mystruct x { int a; int b; } 这样的结构体可以初始化为 {0} 吗?我认为,至少需要 {{0, 0}}。 - tamarintech
@AndreyT: 不仅仅是结构体和数组。在C中任何类型都可以用{0}进行初始化。int x = {0}; 是合法的C语言。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接