2014-06-14 50 views
5

有沒有辦法讓宏在編譯時強制警告和錯誤?#警告和#錯誤作爲宏

我現在有這樣的事情:

#if defined(__clang__) 
# define PRAGMA(x)     _Pragma(#x) 
#elif defined(__GNUC__) 
# define PRAGMA(x)     _Pragma(#x) 
#elif defined(_MSC_VER) 
# define PRAGMA(x)     __pragma(x) 
#endif 

#define STRINGISIZE(str) #str 
#define STR(str)   STRINGISIZE(str) 

#define LINE     STR(__LINE__) 
#define FILE     __FILE__ 
#define FILE_LINE    __FILE__ "(" LINE ")" 

#define INFO(info , msg) \ 
    PRAGMA(message(FILE_LINE ": " #info ": " msg)) 

#define MESSAGE(m)   INFO(msg , m) 
#define WARNING(w)   INFO(warning , w) 
#define ERROR(e)   INFO(error , e) 
#define TODO(t)    INFO(TODO , t) 

int main() 
{ 
    MESSAGE("MSG") 
    TODO("TODO") 
    WARNING("WARN") 
    ERROR("ERROR") 
} 

的Visual Studio 2013將會把這些宏的警告/錯誤,這個例子不會編譯。 GCC和Clang是否有相應的版本?


#if defined(_MSC_VER) 
    #define INFO(info , msg) \ 
     PRAGMA(message(FILE_LINE ": " #info ": " msg)) 
    #define MESSAGE(m)   INFO(info , m) 
    #define WARNING(w)   INFO(warning , w) 
    #define ERROR(e)   INFO(error , e) 
    #define TODO(t)    INFO(todo t) 
#elif defined(__GNUC__) || defined(__clang__) 
    #define INFO(info , msg) \ 
     PRAGMA(#info " : " #msg)) 
    #define MESSAGE(m)   INFO(info , m) 
    #define WARNING(w)   INFO(GCC warning , w) 
    #define ERROR(e)   INFO(GCC error , e) 
    #define TODO(t)    INFO(, "todo" t) 
#endif 
+0

閱讀文檔,man。 –

+1

我真的希望人們不會使用#pragma todo's等他們混亂編譯輸出,永遠不會得到修復 – paulm

回答

5

是的,有。引述GCC preprocessor documentation

#pragma GCC warning 
#pragma GCC error 

#pragma GCC warning "message"使預處理器發出警告診斷與文本「message」。包含在附註中的消息必須是單個字符串文字。同樣,#pragma GCC error "message"發出錯誤消息。與'#warning'和'#error'指令不同,可以使用'_Pragma'將這些編譯指令嵌入到預處理器宏中。

測試表明,這些工作與鏗鏘也。

請注意,您不需要嵌入文件和行信息。該指令將作爲常規診斷輸出,並且所有診斷信息都已包含文件和行信息。

根據具體的宏而定,另一個選項可能是強制對標有warningerror屬性的函數進行函數調用。與編譯指示不同,如果已知函數調用不可訪問(例如,因爲它出現在編譯時檢測到條件的if塊中始終爲false),則屬性不起作用,因此如果在這種情況下您想要警告或錯誤被壓制,他們可能會更合適。

+0

現在正在尋找像3小時,謝謝你給我看:-) – nonsensation

+0

我使用的文件' #pragma GCC warning「message」'但是我得到以下輸出:'warning:忽略#pragma GCC警告[-Wunknown-pragmas] |'使用gcc 4.7.1 – nonsensation

+2

@Serthy它們以GCC 4.8開頭。 [這裏是GCC 4.7文檔](https://gcc.gnu.org/onlinedocs/gcc-4.7.4/cpp/Pragmas.html),[這裏是GCC 4.8文檔](https:// gcc。 gnu.org/onlinedocs/gcc-4.8.3/cpp/Pragmas.html),你可以看到它們已被添加。 'warning'和'error'屬性已經可以使用更長時間了,所以如果你不能升級到GCC 4.8,你可能想使用它們。 – hvd