2010-06-22 99 views
2

这两个方法是否等价?如何在声明中初始化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'

回答

5
  1. 是的,他们是等价的。

  2. 在默认选项下,结构初始化编译时没有警告。如果编译器设置为挑剔,那么你就需要提供一个字符串(在你的第一个问题的两种形式)和一个整数:

    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变为静态变量。

+0

你是什么意思与挑剔? – Job 2010-06-22 15:36:18

+1

使用gcc -Wall启用所有警告,在MSVC中它的警告级别4是其中一个选项 – 2010-06-22 15:47:55

1

1)是的,它们是等效的。 2)尝试

struct c f = { "", 0 } 

您必须初始化两个值。我记得也有问题,你可以试试

struct c f = (struct c){ "", 0 } 

如果它不起作用。

另请参阅this page

+0

没有要求“初始化两个值”。 – AnT 2010-06-22 16:40:37

1

是的,前两个初始化是等价的。

第二次初始化在GCC中工作。你的代码是完全正确的。在C语言中,{ 0 }是可用于几乎任何类型的通用零初始化程序。这是一个古老的,非常成熟的成语。你从海湾合作委员会得到的只是警告,放在那里的人做出了一个相当无知的决定,干扰通用零初始化程序的功能。 [/ rant]我了解他们的一般意图,但具体的{ 0 }表格应该作为一个无警告的例外来处理。[/ rant]我们了解他们的一般意图,但具体的{ 0 }表格应该被视为无警告的例外。