如何獲得GCC或Clang警告我以下錯誤,其中M
在第2行應該是N
?關於不正確的包裝編譯指示的警告
即使有-Wall -Wextra -Wunknown-pragmas
,這些編譯器都不會發出任何警告。
#define N 4
#pragma pack(push, M)
int main() {
return 0;
}
#pragma pack(pop)
如何獲得GCC或Clang警告我以下錯誤,其中M
在第2行應該是N
?關於不正確的包裝編譯指示的警告
即使有-Wall -Wextra -Wunknown-pragmas
,這些編譯器都不會發出任何警告。
#define N 4
#pragma pack(push, M)
int main() {
return 0;
}
#pragma pack(pop)
只有當代碼有效時,編譯器才能知道你的意圖。你可以自己去查了這個
#ifndef M
#error M not defined
#endif
或者,如果M
分別從N
這個
#if M != N
#error M is not N
#endif
如果你看看預處理器的輸出,如果您添加附註不即計算定義N
預處理器完成後,您將不會收到4
。
我不認爲你可以在這裏發出警告,至少不容易,也許預處理器嚮導可能會弄清楚。除非#if
聲明中的值未定義,否則以下警告無效。
-Wundef
如果嘗試添加任何東西到編譯即
#pragma pack(push, (M + 0))
你得到一個警告,因爲編譯期待即
warning: expected integer or identifier in '#pragma pack'
你似乎認爲''M'標識符在'#pragma'中的處理方式與'#i中#'相同fdef'指令。儘管這看起來似乎是合理的,但據我所知,該標準完全取決於實施。你有任何支持你的結論的GCC或Clang文檔嗎? –
@JohnBollinger你是對的,它在叮噹中的處理方式不同,它沒有按照我所知道的那樣進行評估。 – Harry
的#ifndef中號 #ERROR整數或標識符M沒有定義 #endif –