我想制作一个不使用参数但使用预定义整数和字符串的宏。
我之前问过一些与带有参数的宏类似的东西,它是这样的:
#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
最佳答案
在传递给 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_
。
关于c - 使用字符串连接的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604476/