2017-08-24 72 views
0

我在代碼中的一些宏如何欺騙預處理

#define NUM_IN 3 

#define NUM_1 1 
#define NUM_2 2 
#define NUM_3 3 

#define MY(NUMBER) NUM_##NUMBER 

所以如果我調用宏

MY(NUM_IN) 

我預處理的結果3後期待,但我發現NUM_NUM_IN

那麼,我應該這樣做,預處理器將採取輸入爲

第1步

MY(NUM_IN) 

第2步

MY(3) 

第3步

NUM_3 

第4步

3 

請讓我知道我錯過了什麼。我是新來的stackoverflow,所以如果我錯了,請引導我到正確的渠道。
由於

回答

1

宏參數是完全宏擴展它們代入宏體,除非它們stringized或與其它代幣粘貼之前。

所以,在MY(NUM_IN)NUM_IN不會擴大。您需要定義的另一個宏進行連結

#define PASTER(n) NUM_ ## n 
#define MY(NUMBER) PASTER(NUMBER) 

1. GCC文檔:3.5 Concatenation

+0

感謝您的解釋......您的四條線讓我清楚地瞭解了一切。 –

2

添加一個間接層:

#define CAT_(a, b) a ## b  /* Pastes */ 
#define CAT(a, b) CAT_(a, b) /* Expands */ 

#define MY(NUMBER) CAT(NUM_, NUMBER) 
+0

這是間接的兩層。 – haccks

+0

@haccks是。我很習慣這種方法,我不記得爲什麼有兩個... – Quentin

2

添加了一個間接層:

#define NUM_IN 3 

#define NUM_1 1 
#define NUM_2 
#define NUM_3 3 

#define CAT_(X,Y) X##Y 
#define MY(NUMBER) CAT_(NUM_,NUMBER) 

MY(NUM_IN)