1. 程式人生 > >C語言#error預處理

C語言#error預處理

#error 預處理指令的作用是,編譯程式時,只要遇到#error 就會生成一個編譯錯誤提示訊息,並停止編譯。其語法格式為:

#error error-message

注意,巨集串error-message 不用雙引號包圍。遇到#error 指令時,錯誤資訊被顯示,可能同時還顯示編譯程式作者預先定義的其他內容。

該預處理將產生一條編譯時錯誤資訊,資訊中包含#error後指定的內容。

C語言標準中,要求對於#error後面的指定的內容也進行巨集展開,但在我測試後發現Visual Studio 2008並沒有對這一特性提供支援。所以,在我們的程式中,應儘量避免出現不同編譯器實現可能各不相同的標準特性。

該前處理器指令看似無用,因為一旦遇到它,程式的編譯過程就會出錯,無法完成編譯。那麼它應該用在什麼場合呢?

大家想必對”斷言“早有耳聞。在程式執行時,一旦遇到斷言不成立,程式即會報錯終止,以方便程式除錯。#error與#if搭配使用可以認為是一個用於除錯巨集的編譯期斷言。

下面看一個例子說明#error的典型應用例項:

 

[html] view plain copy

  1. #include "stdio.h"  
  2. int main(int argc, char* argv[])   
  3. {  
  4. #define CONST_NAME1 "CONST_NAME1"  
  5.     printf("%s\n",CONST_NAME1);  
  6. #undef CONST_NAME1  
  7.   
  8. #ifndef CONST_NAME1  
  9.     #error No defined Constant Symbol CONST_NAME1  
  10. #endif  
  11.   
  12. #define CONST_NAME2 "CONST_NAME2"  
  13.     printf("%s\n",CONST_NAME2);    
  14.     printf("%s\n",CONST_NAME2);      
  15.     return 0;   
  16. }   

在編譯的時候輸出如編譯資訊 :

 

 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已經被定義了。