2016-04-25 50 views
0

如何獲得GCC或Clang警告我以下錯誤,其中M在第2行應該是N關於不正確的包裝編譯指示的警告

即使有-Wall -Wextra -Wunknown-pragmas,這些編譯器都不會發出任何警告。

#define N 4 
#pragma pack(push, M) 

int main() { 
    return 0; 
} 

#pragma pack(pop) 
+1

的#ifndef中號 #ERROR整數或標識符M沒有定義 #endif –

回答

0

只有當代碼有效時,編譯器才能知道你的意圖。你可以自己去查了這個

#ifndef M 
    #error M not defined 
#endif 

或者,如果M分別從N這個

#if M != N 
    #error M is not N 
#endif 
0

如果你看看預處理器的輸出,如果您添加附註不即計算定義N預處理器完成後,您將不會收到4

我不認爲你可以在這裏發出警告,至少不容易,也許預處理器嚮導可能會弄清楚。除非#if聲明中的值未定義,否則以下警告無效。

-Wundef 

如果嘗試添加任何東西到編譯即

#pragma pack(push, (M + 0)) 

你得到一個警告,因爲編譯期待即

warning: expected integer or identifier in '#pragma pack' 
+1

你似乎認爲''M'標識符在'#pragma'中的處理方式與'#i中#'相同fdef'指令。儘管這看起來似乎是合理的,但據我所知,該標準完全取決於實施。你有任何支持你的結論的GCC或Clang文檔嗎? –

+0

@JohnBollinger你是對的,它在叮噹中的處理方式不同,它沒有按照我所知道的那樣進行評估。 – Harry