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

4

1 回答 1

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_

于 2013-07-11T22:20:17.037 回答