这两种方法是否相同?
char a[10] = "";
char a[10] = { 0 };
另外,我想声明初始化一个结构,但这在gcc中不起作用:
struct c
{
char d[10];
int e;
};
struct c f = { 0 };
a.c:在功能'main'中:
a.c:33:警告:初始化器周围缺少括号
a.c:33:警告:(接近初始化'f.d')
a.c:33:警告:缺少初始化程序
a.c:33:警告:(接近初始化'f.e')
a.c:33:警告:未使用的变量'f'
答案 0 :(得分:6)
是的,两个char []初始化是相同的 - 两者都会初始化数组以包含零。
对于结构问题,请尝试:
struct c f = { {0}, 0 };
(对于支持C99的新版gcc,您还可以name the elements of the structure being initialised.)
答案 1 :(得分:5)
是的,它们是等价的。
在默认选项下,结构初始化在没有警告的情况下编译。如果你将编译器设置为繁琐,那么你需要提供一个字符串(第一个问题中的两种形式之一)和一个整数:
struct c
{
char d[10];
int e;
};
struct c f = { "", 0 };
struct c g = { { 0 }, 0 };
'挑剔'是什么意思:
Osiris-2 JL: cat x.c
struct c
{
char d[10];
int e;
};
struct c f = { 0 };
Osiris-2 JL: gcc -c x.c
Osiris-2 JL: gcc -Wall -c x.c
x.c:6: warning: missing braces around initializer
x.c:6: warning: (near initialization for ‘f.d’)
Osiris-2 JL: gcc -O -Wall -c x.c
x.c:6: warning: missing braces around initializer
x.c:6: warning: (near initialization for ‘f.d’)
Osiris-2 JL: gcc -O -Wextra -Wall -c x.c
x.c:6: warning: missing braces around initializer
x.c:6: warning: (near initialization for ‘f.d’)
x.c:6: warning: missing initializer
x.c:6: warning: (near initialization for ‘f.e’)
Osiris-2 JL:
在这种情况下,GCC'设置挑剔'意味着添加诸如'-Wall'和'-Wextra'之类的选项,以获得比GCC正在编译的C标准所要求的更多警告。由于我没有指定哪个标准,所以它适用于GNU-99标准(-std=gnu99
)。
要从问题中获取“未使用的变量”消息,我必须将变量f变为静态变量。
答案 2 :(得分:1)
1)是的,他们是等同的。 2)尝试
struct c f = { "", 0 }
您必须初始化两个值。我记得也有问题,你可以试试
struct c f = (struct c){ "", 0 }
如果它不起作用。
另见this page。
答案 3 :(得分:1)
是的,前两次初始化是等效的。
第二次初始化将在GCC中工作。你的代码是完全正确的。在C语言中,{ 0 }
是 Universal Zero Initializer ,几乎可用于任何类型。这是一个古老而非常成熟的习语。你从GCC获得的只是警告,由那些做出相当无能为力的决定干扰 Universal Zero Initializer 的功能的人放在那里。
[rant] GCC最近在某些方面一直在流失。[/ rant]我理解他们的一般意图,但具体的{ 0 }
表格应该作为一个无警告的例外处理。