我正在尝试开发PIC微控制器的通用UART模块。我想要做的是定义正在使用的UART,然后让预处理器自动将其替换为其他宏(寄存器名称)。C预处理器宏替换
喜欢的东西:
#define UART 5
#define UART_RXREG U ## UART ## RXREG
这是不行的,因为它扩展到UUARTRXREG
而不是U5RXREG
。
有没有办法做到这一点,或者它根本不可能?
请注意,我不是在寻找一个简单的字符串连接。我需要首先扩展UART宏。
我正在尝试开发PIC微控制器的通用UART模块。我想要做的是定义正在使用的UART,然后让预处理器自动将其替换为其他宏(寄存器名称)。C预处理器宏替换
喜欢的东西:
#define UART 5
#define UART_RXREG U ## UART ## RXREG
这是不行的,因为它扩展到UUARTRXREG
而不是U5RXREG
。
有没有办法做到这一点,或者它根本不可能?
请注意,我不是在寻找一个简单的字符串连接。我需要首先扩展UART宏。
你需要宏观间接的水平,使级联令牌可扩展:
#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)
适用于MSVC。 –
这个工程!谢谢。 – andreia
不,这是不可能的。所有连接操作符都将两个令牌粘贴在一起。就好像你自己写的一样,哪一种能够击败整个观点。更为有用,如果你有一个说法:
#define UART 5
#define _UART_RXREG(x) U ## x ## RXREG
#define UART_REXREG _UART_RXREG(UART)
这里x
被UART
取代,但它不会是宏扩大,期。
我想我应该问,你真的想做什么?
如果您使用支持它的预处理器,它工作正常。 –
为什么不使用带参数的宏? –
@ IgnacioVazquez-Abrams:什么样的预处理器支持它?用'gcc -E','UART_RXREG'扩展为'UUARTRXREG'。我相信那是必需的行为。 –