【发布时间】:2013-07-10 09:07:15
【问题描述】:
我想制作一个不使用参数但已使用预定义整数和字符串的宏。
我之前问过类似的宏有参数,它是这样的:
#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
【问题讨论】:
-
stringify 指令怎么样?
#BUZZER将替换为用双引号括起来的BUZZER宏的值。 -
你不能有两个同名的宏。
-
您不会同时定义
INIT_BUZZER的两个版本,是吗? -
你可以看到它的 INIT_BUZZER 和 INIT_BUZZER_ 所以它是不同的
-
原始
INIT_BUZZER(...)和INIT_BUZZER_(...)的目的是允许INIT_BUZZER的参数在传递给INIT_BUZZER_之前扩展。您需要一个使用一些固定参数的宏INIT_BUZZER。然后,您应该将旧的INIT_BUZZER重命名为其他名称,并让您的新INIT_BUZZER调用它。我在回答中说明了这一点。
标签: c string macros concatenation c-preprocessor