宏使用字符串连接

时间:2013-07-11 22:16:56

标签: c string macros concatenation c-preprocessor

我想创建一个不使用参数但具有预定义整数和字符串的宏。

之前我曾询问过类似于宏的有争议的事情,这是怎么回事:

#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

1 个答案:

答案 0 :(得分: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_