2010-06-22 60 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 }表格應該被視爲無警告的例外。