我有一个指向另一个宏的宏:
#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?
答案 0 :(得分:1)
不,没有。
参与连接(##
)和字符串化(#
)的宏参数在用其定义替换宏的过程中根本不会扩展。因此,通常通过间接宏传递参数,以便将它们完全展开,并将其传递给连接或串联它们的宏。
没有部分扩张的机制。这基本上是全部或全无。
如果你想构建复杂的宏替换链,你需要避免使用单词作为宏和作为标记片段,如在你的例子中。