2014-09-28 75 views
0

更基本的方法:靜態初始化結構以零

struct TEST 
{ 
    float c; 
    unsigned int c1; 
    double c2[5]; 
} t = {0}; 

給出了警告:

警告:缺少初始化爲 '結構TEST'[-Wmissing場,初始化的領域 'C1' ]

同時設定C至INT,長,焦炭(但不是陣列)等...

與陣列它給出警告:

警告:錯過周圍初始化括號[-Wmissing-括號]

是: 我有以下行是這樣的:

#define ADD_STRUCT_TO_ARRAY(xu) X(xu, &(struct xu){})SEP 

這是因爲這些結構必須在許多地方初始化。但它給我的警告:

警告:缺少初始現場「結構A」的「A1」 [-Wmissing場-初始化]

C99標準中應該初始化爲零,擺脫警告?

更改爲

#define ADD_STRUCT_TO_ARRAY(xu) X(xu, &(struct xu){0})SEP 

得到幾乎擺脫了警告但如果該結構的第一個元素是float或double。

任何想法是怎麼回事?還設置0.0似乎沒有幫助

+0

那麼什麼是X和SEP,以及幾乎沒有得到什麼警告?用更清晰的example.X和SEP編輯的 – BonzaiThePenguin 2014-09-28 19:29:17

+0

是宏,您可以輕鬆忽略。 – Lesto 2014-09-28 19:35:49

+0

謝謝,你編輯的例子確實更清晰。 – BonzaiThePenguin 2014-09-29 11:08:34

回答

0

{}是明確不是在C有效的初始化,因此,你看到的第一個警告。 (它對C++有效,但這裏使用的「複合文字」的構造不是)。

現在,一旦您至少有一個初始化程序,這是正確的C.如果您有很多警告標誌,一些編譯器會爲您提供額外的診斷。如果你在這裏,這些只是煩人的。 { 0 }默認初始化程序,因爲它是由C標準預見的。如果沒有其他簡單的方法來平息它,我只需將特定警告(缺少字段初始值設定項)切換。

+0

編輯了這個問題。所以我必須關掉警告,沒有辦法繞過它。 – Lesto 2014-09-28 19:37:14

+0

但仍然,爲什麼警告如果這是安全和標準的使用? – Lesto 2014-09-28 19:52:40

+0

是的,它使用起來很安全。 C標準強制所有未提及的字段被初始化爲「0」,並且如果你願意的話,它也明確地預見到你可以忽略「{}」的級別。 – 2014-09-28 19:57:04