2010-03-11 175 views
29

你能用這樣一個宏嗎?CC預處理器宏定義宏

#define SUPERMACRO(X,Y) #define X Y 

then 

SUPERMACRO(A,B) expands to #define A B 

我有一種感覺,不是因爲預處理器只有一次通過。

官方gcc只。請不要使用第三方工具。

回答

23

宏無法擴展爲預處理指令。從C99 6.10.3.4/3「重新掃描和再替換」:

所得完全宏取代預處理標記序列不被處理,即使它類似於一個預處理指令,

2

對不起,你不能。您可以在宏中調用其他宏,但不能定義新宏。

+0

如果您執行了預處理器的2次通過,那麼該怎麼辦? – pm100 2010-03-11 23:39:28

+1

語法無效。 #在宏中是一種保留字符。 #必須跟一個宏參數纔有效。這將'串化'參數。 – 2010-03-12 00:31:18

3

號操作順序是這樣的:所有預處理器指令在任何宏擴展完成之前都被識別;因此,如果一個宏擴展成看起來像預處理器指令的東西,它將不會被識別,但會被解釋爲(錯誤的)C源文本。

12

您不能在其他宏中定義宏,但可以從宏調用宏,這可以得到基本相同的結果。

#define B(x) do {printf("%d", (x)) }while(0) 
#define A(x) B(x) 

因此,A(y)擴大到do {printf("%d", (y)) }while(0)

0

你可以嘗試只用預處理選項運行事情的經過,然後用處理後的文件進行編譯。

0

你可以做到這一點,但: 的#define SUPERMACRO(X,Y)定義X Y

然後你可以使用你的編輯宏擴展功能,並粘貼缺少#。

甚至更​​好:使用不同的更強大的字符串處理語言作爲預處理器。