预处理器不使用已定义的散列值,而是使用宏的定义字符串

时间:2013-07-09 22:40:15

标签: c hash macros c-preprocessor

我正在尝试一种简单的方法来定义我的IO。我试图用宏来做这个,但我无法解决这个问题。

我这样做了:

// Buzzer PORT and PIN mapping
#define BUZZER_PORT     B       // PORT
#define BUZZER_PIN      2       // PCR pin
#define BUZZER_ALT      1       // Pin alternativne function

#define INIT_BUZZER(PORTX, PIN, ALT) { PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX((ALT)) |     PORT_PCR_DSE_MASK;            GPIO##PORTX##_PDDR |= PIN<<1; }

函数调用工作:

INIT_BUZZER(B, BUZZER_PIN, BUZZER_ALT);

需要函数调用:

INIT_BUZZER(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT);

如果我用端口参数BUZZER_PORT调用它,我会收到错误,因为编译器不接受我的参数值而是字符串本身。

如何处理?

2 个答案:

答案 0 :(得分:0)

尽可能使用括号。

尝试以下: INIT_BUZZER((BUZZER_PORT),BUZZER_PIN,BUZZER_ALT);

答案 1 :(得分:0)

你需要间接:

#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)

另请注意do {...} while(0)并且没有分号,这是在宏中包含多行的常规方法