我正在尝试使用以下语法将结构体数组初始化为全0:
STRUCTA array[MAX] = {0};
然而,我从gcc得到了以下警告:
警告:初始化缺少花括号
我做错了什么 - 是否有其他/更好的方法来解决这个问题?
我正在尝试使用以下语法将结构体数组初始化为全0:
STRUCTA array[MAX] = {0};
然而,我从gcc得到了以下警告:
警告:初始化缺少花括号
我做错了什么 - 是否有其他/更好的方法来解决这个问题?
如果您的结构体的第一个成员是标量类型,请使用
STRUCTA array[MAX] = {{ 0 }};
如果你的结构体的第一个成员恰好是另一个结构体对象,其第一个成员具有标量类型,那么你就必须使用
STRUCTA array[MAX] = {{{ 0 }}};
基本上,每当您“进入”另一个嵌套聚合(结构体或数组)时,都必须打开一级新的嵌套{}
。因此,在这种情况下,只要每个嵌套聚合的第一个成员也是聚合,您就需要使用{}
更深层次。
所有这些额外的大括号只是为了避免警告。当然,在这种特定情况下,这只是一个无害的警告。您可以使用简单的{ 0 }
就可以正常工作。
可能处理此问题的最佳方法是完全禁用此警告(请参见@pmg的答案以获取正确的命令行选项)。GCC的某个工作人员没有想清楚。我的意思是,我理解该警告的价值(它确实非常有用),但破坏了{ 0 }
的功能是不可接受的。应该给{ 0 }
特殊待遇。
{ 0 }
,它是通用的零初始化器。你公司的政策正在破坏C语言中最干净、最有用的惯用法之一。 - AnT stands with Russiagcc很烦人。它应该接受没有警告的代码。
尝试这个。
STRUCTA array[MAX] = {{0}};
-Wmissing-braces
或-Wno-missing-braces
来控制。
-Wall
启用此警告;要使用-Wall
但不需要缺少括号,请使用-Wall -Wno-missing-braces
。这只是gcc发出的一个有害警告,可以使用-Wno-braces
来禁用它。 {0}
是一种非常有用的“通用零初始化器”,适用于您的代码不应该了解其定义的类型,并且gcc阻止其使用会对编写优质代码造成积极的不良影响。
如果gcc想保留此警告,至少应针对{0}
进行特殊处理,在这种情况下禁用警告。
这取决于STRUCTA。例如:
typedef struct structa
{
int a, b;
} STRUCTA;
int main (int argc, char const* argv[])
{
STRUCTA array[10] = {{0,0}};
return 0;
}
数组使用大括号进行初始化,但结构体也是如此。您可能需要在0周围再加上一组额外的大括号,并根据STRUCTA
的定义情况,在逗号分隔的一些额外0之间添加。
STRUCTA 可以被赋值为 0 吗?
你也可以随时使用 memset()。
{0}
进行初始化。 - AnT stands with Russia{0}
进行初始化。int x = {0};
是合法的C语言。 - R.. GitHub STOP HELPING ICE