我想在我的库项目中使用预处理器创建某种智能名称定义。例如,我有一个名为 TC0 的计时器和一些中断处理程序的附加名称,如 TC0_Handler 和 TC0_IRQn。如果能够仅定义一个计时器名称(也可以是 TC1、TC2 等)并像这样使用它,那就太好了:
#define MY_TIMER TC0
#define MY_TIMER_HANDLER MY_TIMER ## _Handler
#define MY_TIMER_IRQ MY_TIMER ## _IRQn
但问题在于,定时器ic实际上不是一个简单的名称,而是在特定于平台的标头中定义的宏:
#define TC0 ((Tc *)0x42003000UL)
所以它是由预处理器处理的,并且不允许按照我想要的方式使用它。
这个问题有什么解决办法吗?
'##' 不会将其操作数扩展为其实际值。 尝试使用 -E 选项编译下面的代码:
#define VAR ((int*)0xffff)
#define VAR_HANDLER VAR ## _handler
int VAR_HANDLER = VAR; // just to see the result
int
main (void)
{
;
}
输出为:
int VAR_handler = ((int*)0xffff);
int
main (void)
{
;
}