C预处理器 - 连接字符串而无需多次解析

时间:2017-02-25 01:28:11

标签: c concatenation stm32 preprocessor

我有一个指向另一个宏的宏:

#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 :(得分:1)

不,没有。

参与连接(##)和字符串化(#)的宏参数在用其定义替换宏的过程中根本不会扩展。因此,通常通过间接宏传递参数,以便将它们完全展开,并将其传递给连接或串联它们的宏。

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

如果你想构建复杂的宏替换链,你需要避免使用单词作为宏和作为标记片段,如在你的例子中。