C語言#error預處理
#error 預處理指令的作用是,編譯程式時,只要遇到#error 就會生成一個編譯錯誤提示訊息,並停止編譯。其語法格式為:
#error error-message
注意,巨集串error-message 不用雙引號包圍。遇到#error 指令時,錯誤資訊被顯示,可能同時還顯示編譯程式作者預先定義的其他內容。
該預處理將產生一條編譯時錯誤資訊,資訊中包含#error後指定的內容。
C語言標準中,要求對於#error後面的指定的內容也進行巨集展開,但在我測試後發現Visual Studio 2008並沒有對這一特性提供支援。所以,在我們的程式中,應儘量避免出現不同編譯器實現可能各不相同的標準特性。
該前處理器指令看似無用,因為一旦遇到它,程式的編譯過程就會出錯,無法完成編譯。那麼它應該用在什麼場合呢?
大家想必對”斷言“早有耳聞。在程式執行時,一旦遇到斷言不成立,程式即會報錯終止,以方便程式除錯。#error與#if搭配使用可以認為是一個用於除錯巨集的編譯期斷言。
下面看一個例子說明#error的典型應用例項:
[html] view plain copy
- #include "stdio.h"
- int main(int argc, char* argv[])
- {
- #define CONST_NAME1 "CONST_NAME1"
- printf("%s\n",CONST_NAME1);
- #undef CONST_NAME1
- #ifndef CONST_NAME1
- #error No defined Constant Symbol CONST_NAME1
- #endif
- #define CONST_NAME2 "CONST_NAME2"
- printf("%s\n",CONST_NAME2);
- printf("%s\n",CONST_NAME2);
- return 0;
- }
在編譯的時候輸出如編譯資訊 :
fatal error C1189: #error : No defined Constant Symbol CONST_NAME1
上面的程式碼會引發一個#error錯誤。綜上,對含有複雜邏輯的巨集程式碼使用#error是一個很好用的技巧。它確保了程式在關鍵點上確實按照程式設計師的想法被預處理,否則便無法編譯通過。而且,重要的是:編譯期行為不會引起任何執行期的資源開銷。
編譯程式時,只要遇到 #error 就會跳出一個編譯錯誤,既然是編譯錯誤,要它幹嘛呢?其目的就是保證程式是按照你所設想的那樣進行編譯的。
下面舉個例子:
程式中往往有很多的預處理指令
#ifdef XXX
...
#else
#endif
當程式比較大時,往往有些巨集定義是在外部指定的(如makefile),或是在系統標頭檔案中指定的,當你不太確定當前是否定義了 XXX 時,就可以改成如下這樣進行編譯:
#ifdef XXX
...
#error "XXX has been defined"
#else
#endif
這樣,如果編譯時出現錯誤,輸出了XXX has been defined,表明巨集XXX已經被定義了。