2010-05-08 53 views
13

我從#猜測它只是一個編譯時工具。它如何在C/C++程序中使用?C/C++中的#error如何工作?

在互聯網上沒有發現太多。任何鏈接都會有幫助。

回答

12

它使編譯器(或預處理器)輸出錯誤消息。在C++中,它也會使翻譯單元不合格(即導致編譯失敗)。

如果您有幾個可以定義的宏,並且您希望確定只定義了它們的某些組合,那麼如果定義了無效組合,則可以使用#error導致編譯失敗。

如果您想確保某段代碼從未編譯過(無論出於何種原因),它也會很有用。

+1

你是什麼意思的「只有特定的宏組合定義」。你能引用一個例子嗎?謝謝。 – Moeb 2010-05-08 21:11:02

+0

@cambr:例如,如果你有兩個宏,'DO_X'和'DO_Y',並且你想確保一次只設置一個宏,你可以在'#if(定義的DO_X)中包裝一個'#error'指令)&&(定義DO_Y)'塊。 – 2010-05-08 21:14:55

+5

@cambr:假設貴公司出售Slicer™和Dicer™。這兩種產品都使用'blade.c',但它們通過構建系統傳遞不同的宏以實現稍微不同的功能。然後你可以使用'#if SLICING ... #elif DICING ... #else #error沒有makefile選擇的功能。' – Potatoswatter 2010-05-08 21:35:02

2

下面是GNU的預處理器解釋#error#warning指令的文檔的鏈接:http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

特別是:

#error導致 預處理器報告一個致命錯誤的指令。 形成 行其餘部分的標記#error被用作 的錯誤消息。

另請參閱this question關於這些指令的可移植性。

+4

'#error'指令是C和C++語言標準的一部分,是完全可移植的。 '#warning'是一個gcc特定的語言擴展。 – 2010-05-08 21:18:53

+0

@詹姆斯,感謝您的澄清。 – UncleZeiv 2010-05-08 21:22:11

9

用於檢查編譯器設置以及驗證宏值組合。一些隨機的例子:

#if !defined(_DLL) 
# error This code will only work properly when compiled with /MD 
#endif 

#if _WIN32_WINNT < 0x502 
# error Sorry, Windows versions prior to XP SP2 are not supported 
#endif 

#if defined(_APPLE) && defined(_LINUX) 
# error Conflicting operating system option selected, choose one. 
#endif 
+0

你真的在處理最後一個練習嗎?不是用戶的責任不是braindead而不是使用無意義的編譯器標誌?你不能檢查*一切* ... – Thomas 2013-11-26 07:48:14

+3

這只是一個例子。當你有太多的支持電話時,你往往會添加這些東西。舉例來說,Boost充滿了它。 – 2013-11-26 11:02:20

相關問題