C预处理器宏替换

时间:2016-05-17 18:25:30

标签: c

我正在尝试为PIC微控制器开发通用UART模块。我要做的是定义正在使用的UART,然后让预处理器自动将其替换为其他宏(寄存器名称)。

类似的东西:

#define UART        5
#define UART_RXREG  U ## UART ## RXREG

这不起作用,因为它扩展为UUARTRXREG而不是U5RXREG

有没有办法做到这一点,还是根本不可能?

请注意,我不是在寻找简单的字符串连接。我需要先扩展UART宏。

2 个答案:

答案 0 :(得分:10)

您需要一个宏间接级别,以便可以扩展连接的标记:

#define CONCAT3_(a,b,c) a##b##c
#define CONCAT3(a,b,c) CONCAT3_(a,b,c)

#define UART 5
#define UART_RXREG  CONCAT3(U,UART,RXREG)

答案 1 :(得分:1)

不,这是不可能的。所有连接运算符都将两个标记粘贴在一起。就好像你自己写的那样,哪种方式打败了整个点。如果你有一个参数,它会更有用:

#define UART        5
#define _UART_RXREG(x)  U ## x ## RXREG
#define UART_REXREG _UART_RXREG(UART)

此处x已替换为UART,但不会进行宏展开,期间。

我想我应该问,你到底想做什么?