2013-07-11 73 views
1

我想創建一個不使用參數但具有預定義的整數和使用的字符串的宏。使用字符串連接的宏

我關於與宏類似的東西,有論據之前問這是怎麼回事:

#define BUZZER_PIN 1 
#define BUZZER_PORT B 
#define BUZZER_ALT 1 

#define INIT_BUZZER_(PORTX, PIN, ALT)         \ 
    do {                \ 
     PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX(ALT) | PORT_PCR_DSE_MASK; \ 
     GPIO##PORTX##_PDDR |= (PIN)<<1;         \ 
     } while (0) 

#define INIT_BUZZER(PORTX, PIN, ALT)         \ 
    INIT_BUZZER_(PORTX, PIN, ALT) 

,但如果我只是想有INIT_BUZZER將要參考INIT_BUZZER_及以上做什麼?

我想:

#define INIT_BUZZER INIT_BUZZER_(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT) 

我總是隻有與字符串的問題,我不明白,部分好。 如果我把它這樣,我得到BUZZER_PORT處理爲字符串BUZZER_PORT並不像它的價值= B

+0

stringify指令怎麼樣? '#BUZZER'將降低由雙引號包圍的'BUZZER'宏的值。 – 2013-07-11 22:19:29

+0

你不能有兩個同名的宏。 – jxh

+0

你不是想同時定義兩個版本的'INIT_BUZZER',是嗎? – user2357112

回答

2

你需要另一個宏它被傳遞給INIT_BUZZER_前展開宏參數。

#define INIT_BUZZER_X(PORTX, PIN, ALT)         \ 
    INIT_BUZZER_(PORTX, PIN, ALT) 

#define INIT_BUZZER INIT_BUZZER_X(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT) 

現在,當你在代碼中使用INIT_BUZZER,它首先會擴展到INIT_BUZZER_X與三個參數。預處理器將繼續處理INIT_BUZZER_X,其中它將擴展三個參數中的每一個,並將它們傳遞給INIT_BUZZER_

+0

謝謝你的工作。但使用這些宏看起來非常困難 – user2566355