是否有编译器指令来替换常量的一部分

时间:2012-04-11 20:10:43

标签: c compiler-construction compiler-directives preprocessor-directive

我现在正在使用嵌入式C作为微控制器,我发现有时候有几个外设只有一个字母(例如UARTA,UARTB等)。除了相同寄存器的字母外,每个外设的代码通常是相同的。例如,为了设置外围设备A,我会做类似的事情:

UCA2CTL1 |= UCSWRST;                      // Put state machine in reset
UCA2CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave
// Continue initializing peripheral registers with "A" in name

设置外围设备B我的代码完全相同,只是寄存器名称被转换为1个字母:

UCB2CTL1 |= UCSWRST;                      // Put state machine in reset
UCB2CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave
// Continue initializing peripheral registers with "B" in name

我希望能够更改我定位的外围设备而无需#ifdef / copy / paste代码或查找/替换。是否有一些编译器指令或聪明的技巧可以实现这种行为,所以我只需要编写一次代码?我很乐意#define外围设备中的最后一个字母,但是这样的东西似乎危险地靠近代码发臭我。

2 个答案:

答案 0 :(得分:3)

这对你有用吗?

#define INITUC(device) \
UC ## device ## 2CTL1 |= UCSWRST; \
UC ## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB
...
INITUC(A);
INITUC(B);

答案 1 :(得分:1)

假设这些常量是const而不是defines你可以这样做:

#define MAKECONST(X) const int X ## 1; \
                     const int X ## 0; \
                     X ## 1 |= UCSWRST; \
                     X ## 0 |= UCSYNC+UCCKPL+UCMSB;

然后:

MAKECONST(UCA2CTL)
MAKECONST(UCB2CTL)

请注意,我的示例包括声明,如果需要,我不知道,如果不需要,则省略define的前两行。 E.g:

#define SETUP(X) X ## 1 |= UCSWRST; \
                 X ## 0 |= UCSYNC+UCCKPL+UCMSB;