下面的代碼不會編譯:編譯錯誤C2099:初始化不是一個常數
const int a = 0;
struct Test
{
int b;
};
static const struct Test test =
{
a
};
它的什麼我真的想做一個減少的例子,但我究竟做錯了什麼?
下面的代碼不會編譯:編譯錯誤C2099:初始化不是一個常數
const int a = 0;
struct Test
{
int b;
};
static const struct Test test =
{
a
};
它的什麼我真的想做一個減少的例子,但我究竟做錯了什麼?
在C語言的C89/90版本中,所有聚合初始值設定項只能由常數組成。在C語言術語中,常量的int
類型是文字值,如10
,20u
,0x1
等。枚舉成員也是常量。 const int
類型的變量是而不是中的常量。在集合初始值設定項中不能使用const int
變量。 (由於這個原因,在C語言中,當你需要聲明一個名爲常量,你應該使用#define
或enum
,但不const
預選賽。)
在C99這一要求的骨料初始化很輕鬆。現在可以在局部對象的聚合初始化器中使用非常量。但是,對於靜態對象(如你的例子),這個需求仍然存在。因此,即使在C99中,您也不得不使用
#define a 0
或者使用@R ..的答案中建議的命名枚舉常量。
+1,比我的回答更完整,即使稍微偏離了幾點。您可能想要使用短語「常量表達式」,而不是「常量」,因爲前者在C語言中有一個正式的定義,並且清楚地表明覆雜表達式可以滿足要求,只要它們的組成部分「足夠」不變」。 – 2011-05-25 23:34:22
a
不是一個常量表達式。這是一個const
限定變量。如果您需要可以在常量表達式中使用的符號名稱,則需要預處理器宏(#define a 0
)或枚舉(enum { a = 0 };
)。
注意 - 這在C++中是不同的,它可以讓您使用在其他常量表達式中用常量表達式初始化的'const'限定整型變量。 – 2011-05-25 22:28:21
已注意。在Java和C#中它也不同嗎?如何Python?還是lisp? ;-) – 2011-05-25 22:51:17
你有沒有嘗試在單獨的項目中編譯它?對我來說看起來很完美。 – 2011-05-25 22:03:42