2011-05-25 58 views
6

下面的代碼不會編譯:編譯錯誤C2099:初始化不是一個常數

const int a = 0; 

struct Test 
{ 
    int b; 
}; 

static const struct Test test = 
{ 
    a 
}; 

它的什麼我真的想做一個減少的例子,但我究竟做錯了什麼?

+0

你有沒有嘗試在單獨的項目中編譯它?對我來說看起來很完美。 – 2011-05-25 22:03:42

回答

11

在C語言的C89/90版本中,所有聚合初始值設定項只能由常數組成。在C語言術語中,常量int類型是文字值,如10,20u,0x1等。枚舉成員也是常量。 const int類型的變量是而不是中的常量。在集合初始值設定項中不能使用const int變量。 (由於這個原因,在C語言中,當你需要聲明一個名爲常量,你應該使用#defineenum,但不const預選賽。)

在C99這一要求的骨料初始化很輕鬆。現在可以在局部對象的聚合初始化器中使用非常量。但是,對於靜態對象(如你的例子),這個需求仍然存在。因此,即使在C99中,您也不得不使用

#define a 0 

或者使用@R ..的答案中建議的命名枚舉常量。

+1

+1,比我的回答更完整,即使稍微偏離了幾點。您可能想要使用短語「常量表達式」,而不是「常量」,因爲前者在C語言中有一個正式的定義,並且清楚地表明覆雜表達式可以滿足要求,只要它們的組成部分「足夠」不變」。 – 2011-05-25 23:34:22

6

a不是一個常量表達式。這是一個const限定變量。如果您需要可以在常量表達式中使用的符號名稱,則需要預處理器宏(#define a 0)或枚舉(enum { a = 0 };)。

+4

注意 - 這在C++中是不同的,它可以讓您使用在其他常量表達式中用常量表達式初始化的'const'限定整型變量。 – 2011-05-25 22:28:21

+0

已注意。在Java和C#中它也不同嗎?如何Python?還是lisp? ;-) – 2011-05-25 22:51:17

相關問題