2017-05-04 46 views
0

我有一個代碼,它使用#warning很多信號編譯時間分支給用戶。代碼有很多配置選項,因此不清楚代碼中的哪些位實際上被納入編譯。有條件地使用#warning或#pragma消息或什麼也沒有

一旦你選擇了配置選項,那些警告確實混亂了輸出。所以我想能夠禁用它們。最簡單的方法是將每個警告包裝到#ifdef ... #else結構中。但如果我再次觸摸該代碼,則需要再次查看整個代碼庫。

所以相反,我想抽象一點。但是,我試圖定義一個調用#warning#pragma message的宏。下面編譯但無法做正確的事情:

#ifdef EMIT_WARNINGS 
#define WARNING(s) _Pragma("message(\"Hi\")") 
#else 
#define WARNING(s) 
#endif 

WARNING("How can I print this?") 

所有我的推杆s到有失敗的嘗試。一旦我做_Pragma("message(\"" s "\")"),我得到_Pragma需要一個括號字符串。

有什麼我可以做的很好的抽象嗎?

回答

0
我所有把s放到那裏的嘗試都失敗了。一旦我做_Pragma(「message(\」「s」\「)」),我得到_Pragma需要一個括號字符串。

_Pragma(S)具有同等效果,以#pragma X,其中X是unstringified紙S的倒退,這意味着要獲得的#pragma X_Pragma通話效果,你只需要字符串化 X.

X的一部分本身就是一個字符串的事實會誤導你......不要把這些看作是你正在裝配的東西,而是把它看作是一個整體。而不是試圖字符串化s並把它裏面"message(\"""\")",只是字符串化message(s)本身作爲一個整體,就像這樣:

#ifdef EMIT_WARNINGS 
#define WARNING_I(s) _Pragma(#s) 
#define WARNING(s) WARNING_I(message(s)) 
#else 
#define WARNING(s) 
#endif 
WARNING("How can I print this?") 

所以,當警告被啓用,WARNING("How can I print this?")擴展到WARNING_I(message("How can I print this"))。對於WARNING_I的這種說法本身就是你在編譯指示行上所做的;它是你的X。然後將WARNING_I的定義串化,爲_Pragma製作正確的S

相關問題