2011-10-09 144 views
3

我遇到了一個問題,似乎在C89之後的任何C標準都沒有解決,除非提及結構初始化限制已被解除。但是,我使用Open Watcom IDE(用於調試)遇到錯誤,其中編譯器指出初始化程序必須是常量表達式。用變量C結構初始化

以下是發生了什麼事情的要點。

typedef struct{ 
short x; 
short y; 

} POINT; 

void foo(short x, short y) 
{ 
POINT here = { x, y }; /* <-- This is generating the error for the compiler */ 

/* ... */ 

} 

任何想法爲什麼,或什麼標準不允許的呢?

+1

我不知道你的問題的答案,但我會建議你創建一個函數,如:POINT createPOINT(x,y)來初始化所有POINT類型的變量。 –

回答

6

以下報價是從C99 rationale

的C89委員會審議了關於允許自動 總初始化到由一撐包含任意執行時間表達式的 系列,而不僅僅是可用於翻譯時靜態初始化程序的 。 C89委員會決定只允許靜態的 初始值設定項,而不是確定一套可避免病態情況的規則,但看起來並不過分。重新考慮了這一點,並且在C99中有效的執行時表達式爲 。

+0

啊!這是另一個C99功能。這就解釋了爲什麼只有Watcom的編譯器有問題。謝謝。 –

2

問題是C不是對象語言,只能進行嚴格的輸入。此外,C維護結構和數組之間的區別。

你的代碼將不得不工作的方式是

void foo(short x, short y) 
{ 
POINT here; 
here.x = x; 
here.y = y; 
} 
+0

我知道這是一個解決方案,我更想知道爲什麼Watcom的編譯器會在其他人(gcc和MSVC具體)拋出錯誤的時候拋出錯誤......您是否認爲Watcom仍然使用C89以前的標準? –

+0

這完全有可能。並非所有編譯器都完全符合規範。 –

+0

默認情況下,GCC不會針對C89進行嚴格編譯,除非指定'-ansi'或'std = c89'。默認情況下,它是具有某些C99功能的C89。可以說,你應該總是按照GCC的標準進行編譯以獲得可移植性。 –

0

這對於C89來說是正常的......初始化器需要保持不變,即。能夠在編譯時確定。這意味着初始化程序中沒有變量,對於其他類型也是如此,而不僅僅是結構體。在C99中,你的代碼可以工作。