如何在声明中初始化char数组
这两个方法是否等价?如何在声明中初始化char数组
char a[10] = "";
char a[10] = { 0 };
另外,我想声明初始化一个结构,但是这不会在海湾合作委员会的工作:
struct c
{
char d[10];
int e;
};
struct c f = { 0 };
交流:在函数 '主':
AC:33:警告:失踪各地初始化括号
AC:33:警告:(近初始化为 'F.D')
AC:33:警告:缺少初始化
AC:33:警告:(近初始化为 'f.e')
a.c:33:警告:未使用的变量'f'
是的,他们是等价的。
-
在默认选项下,结构初始化编译时没有警告。如果编译器设置为挑剔,那么你就需要提供一个字符串(在你的第一个问题的两种形式)和一个整数:
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:
在这种情况下,海湾合作委员会“成立挑剔”是指增加类似的选项“-Wall”和“-Wextra”,以获得比通过GCC编译是在C标准,需要更多的警告。由于我没有指定哪个标准,它正在遵循GNU-99标准(-std=gnu99
)。
为了从问题中获得'未使用的变量'消息,我必须将变量f变为静态变量。
是的,两个char []初始化是相同的 - 都将初始化数组以包含零。
对于结构问题,请尝试:
struct c f = { {0}, 0 };
(使用支持C99还可以name the elements of the structure being initialised. GCC的新版本)
是的,前两个初始化是等价的。
第二次初始化将在GCC中工作。你的代码是完全正确的。在C语言中,{ 0 }
是可用于几乎任何类型的通用零初始化程序。这是一个古老的,非常成熟的成语。你从海湾合作委员会得到的只是警告,放在那里的人做出了一个相当无知的决定,干扰通用零初始化程序的功能。 [/ rant]我了解他们的一般意图,但具体的{ 0 }
表格应该作为一个无警告的例外来处理。[/ rant]我们了解他们的一般意图,但具体的{ 0 }
表格应该被视为无警告的例外。
你是什么意思与挑剔? – Job 2010-06-22 15:36:18
使用gcc -Wall启用所有警告,在MSVC中它的警告级别4是其中一个选项 – 2010-06-22 15:47:55