2011-05-27 56 views
7

可能重複:
C preprocessor: using #if inside #define?預處理指令內定義?

有什麼竅門有內部定義的RHS預處理指令?問題是,預處理器將所有rhs折成一行。但也許有一個竅門?什麼我會在RHS想

例子是

#define MY_CHECK \ 
    #ifndef MY_DEF \ 
    # error MY_DEF not defined \ 
    #endif 


目的是急促:具有1行的快捷方式,而不是檢查的多序列。

回答

9

正如其他人指出,預處理宏不能擴展到任何其他預處理指令;如果他們這樣做的話,你通常會在輸入中出現奇怪的'#'字符錯誤。但是,有時候你可以做些事情來獲得你想要的東西。如果您希望擴展到像宏:

#ifdef SOMETHING 
...some code... 
#endif 

其中一些代碼不包括任何預處理指令,你可以定義一個IFDEF宏:

#ifdef SOMETHING 
#define IFDEF_SOMETHING(X) X 
#else 
#define IFDEF_SOMETHING(X) 
#endif 

,然後用IFDEF_SOMETHING(...some code...)在你的另一個宏。

如果你有一堆想要重複多次的預處理程序,可以將它粘在自己的文件中,然後在每個需要它的地方使用#include "stuff"

+0

... _some code_最好不要有任何逗號無論是。 – 2011-05-27 07:04:30

+0

@約翰:是的,雖然與C99可以用'...'/'__VA_ARGS__'以避免在不同的.h文件中預處理指令的這個問題 – 2011-05-27 16:32:57

+0

投入順序和包括它是不錯的主意。 – Andrei 2011-05-27 16:47:09

2

假設一個預處理器,如GNU C Preprocessor,則沒有。 The manual says

編譯器不重新標記預處理器的輸出。每個預處理令牌都將成爲一個編譯器令牌。

4

它不起作用(§6.10.3.4/ 3:「產生的完全宏替換預處理令牌序列不作爲預處理指令處理,即使它類似於...」)。

如果你真的想要做這樣的事情,你可以通過編譯之前類似M4運行源 - 但我一般會建議反對。