2016-05-17 153 views
4

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

喜欢的东西:

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

这是不行的,因为它扩展到UUARTRXREG而不是U5RXREG

有没有办法做到这一点,或者它根本不可能?

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

+0

如果您使用支持它的预处理器,它工作正常。 –

+1

为什么不使用带参数的宏? –

+0

@ IgnacioVazquez-Abrams:什么样的预处理器支持它?用'gcc -E','UART_RXREG'扩展为'UUARTRXREG'。我相信那是必需的行为。 –

回答

9

你需要宏观间接的水平,使级联令牌可扩展:

#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) 
+0

适用于MSVC。 –

+0

这个工程!谢谢。 – andreia

1

不,这是不可能的。所有连接操作符都将两个令牌粘贴在一起。就好像你自己写的一样,哪一种能够击败整个观点。更为有用,如果你有一个说法:

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

这里xUART取代,但它不会是宏扩大,期。

我想我应该问,你真的想做什么?