2013-08-28 50 views
3

我正在用微芯片XC8 C編譯器開發1.12。sizeof(struct foo)不是常量?

我有下面的代碼片段,但編譯器不滿意它。

struct _foo { 
    int a; 
}; 

enum BAR { 
    CONST1 = sizeof(struct _foo) 
}; 

我得到的錯誤是:main.c:6: error: integer expression required 爲什麼會產生這個錯誤? C中的任何結構的大小不變嗎? 如果我使用sizeof(int),一切正常。

注:XC8編譯器v1.12遵循C90標準,而不是現代C99標準。

PS這並不編譯:

char abc[sizeof(struct _foo)]; 

而且這種表達也需要一個編譯時間常數導致我認爲這其實不是什麼錯在枚舉聲明。

+6

這看起來像編譯器中的限制。 – ouah

+0

@Gilles:不,變長數組不能是結構的成員。 (有靈活的數組成員,但它們不會影響'sizeof'報告的大小。) –

+1

'const int sizeof_foo = sizeof(struct _foo);枚舉BAR {CONST1 = sizeof_foo};'工作?我不希望它有任何區別,但它值得一試。 –

回答

3

這看起來像是Microchip XC8編譯器的限制/錯誤。

在枚舉常量定義中,當X是聚合類型或聯合類型或聚合類型或聯合類型的對象時,編譯器不會將sizeof (X)視爲常量表達式(即使實際上是c90或c99) 。

+1

是的,這是一個編譯器限制,但不是你描述的限制,因爲'sizeof(int)'工作。 – Gilles

+0

@Gilles是否解決了編譯錯誤?編譯器可能會對標準標量類型的大小作出一些限制「例外」。 – ouah

+0

@Gilles我在我的機器上安裝了編譯器,事實上我之前的解釋並不是那麼好。 – ouah

相關問題