2017-02-25 51 views
2

我有一个指向另一个宏宏:C预处理 - 连接字符串没有多个解决

#define USART1    ((USART_TypeDef *) USART1_BASE) 
#define PIPE1    USART1 

我想补充,我将作为一个函数定义中使用静态文本(USART1变得USART1_IRQHandler) 。我试过类似于:

#define _IRQ(NAME)  NAME ## _IRQHandler 
void _IRQ(PIPE1)(void) { 
    //... 
} 

但名称解析为PIPE1_IRQHandler而不是USART1_IRQHandler。然后我试图#NAME得到PIPE1的价值,但它已经完全解决最低级表示:

((USART_TypeDef *) ((((uint32_t)0x40000000) + 0x10000) + 0x3800)) 

有没有什么办法让USART1_IRQHandler?

回答

1

不,没有。

参数连接(##)和字符串化(#)的宏参数在用其定义替换宏时根本没有展开。因此,通过一个间接宏来传递参数是很常见的,所以它们将被完全放大,并传递给连接或串联它们的宏。

没有部分扩展的机制。这基本上是全部或没有。

如果您想构建复杂的宏替换链,则需要避免将词作为宏和标记段使用,如示例中所示。

+0

谢谢你的回答,那解释了一切。值得一试... – mopsiok