我想创建一个不使用参数但具有预定义整数和字符串的宏。
之前我曾询问过类似于宏的有争议的事情,这是怎么回事:
#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 :(得分: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_
。