有什麼竅門有內部定義的RHS預處理指令?問題是,預處理器將所有rhs折成一行。但也許有一個竅門?什麼我會在RHS想
例子是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
?
目的是急促:具有1行的快捷方式,而不是檢查的多序列。
有什麼竅門有內部定義的RHS預處理指令?問題是,預處理器將所有rhs折成一行。但也許有一個竅門?什麼我會在RHS想
例子是
#define MY_CHECK \
#ifndef MY_DEF \
# error MY_DEF not defined \
#endif
?
目的是急促:具有1行的快捷方式,而不是檢查的多序列。
正如其他人指出,預處理宏不能擴展到任何其他預處理指令;如果他們這樣做的話,你通常會在輸入中出現奇怪的'#'字符錯誤。但是,有時候你可以做些事情來獲得你想要的東西。如果您希望擴展到像宏:
#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"
。
假設一個預處理器,如GNU C Preprocessor,則沒有。 The manual says:
編譯器不重新標記預處理器的輸出。每個預處理令牌都將成爲一個編譯器令牌。
它不起作用(§6.10.3.4/ 3:「產生的完全宏替換預處理令牌序列不作爲預處理指令處理,即使它類似於...」)。
如果你真的想要做這樣的事情,你可以通過編譯之前類似M4運行源 - 但我一般會建議反對。
... _some code_最好不要有任何逗號無論是。 – 2011-05-27 07:04:30
@約翰:是的,雖然與C99可以用'...'/'__VA_ARGS__'以避免在不同的.h文件中預處理指令的這個問題 – 2011-05-27 16:32:57
投入順序和包括它是不錯的主意。 – Andrei 2011-05-27 16:47:09