【发布时间】:2015-07-12 22:24:12
【问题描述】:
是否可以创建一个预处理器函数来定义多个其他预处理器宏?
我正在一个微控制器框架中工作,该框架需要创建一些宏才能使通用中断处理程序起作用:
<MODULE_NAME>_IRQ_PIN //ex: PORTB_PIN(0)
<MODULE_NAME>_IRQ_IN_REGISTER //ex: GPIO_PBIN
<MODULE_NAME>_IRQ_NUMBER //ex: GPIO_IRQA
<MODULE_NAME>_IRQ_INTCFG_REG //ex: GPIO_INTCFGA
从实施的角度来看,我试图使这个过程更通用、更容易。大约有十个这样的宏需要定义,但是当给定 1)端口名称 2)引脚号和 3)IRQ 名称时,它们的定义都可以派生出来。我希望然后创建一个预处理器函数,该函数将导致生成所有这些宏。比如:
#define MAKE_INTERRUPT_MACROS(module, port, pin, irq_num) \
#define module##_IRQ_pin PORT##port##_PIN(##pin##) \
#define module##_IRQ_IN_REGISTER GPIO_P##port##IN \
#define module##_IRQ_NUMBER GPIO_IRQ##irq_num \
#define module##_IRQ_INTCFG_REG GPIO_INTCFG##irq_num
是否有合法的方法让预处理器执行上述操作,其中单个预处理器函数会导致根据传递给函数的参数生成多个其他宏?
【问题讨论】:
-
你不能在宏中使用
#define -
这些都是宏有必要吗?你可以将它们声明为
staticconst-qualified 对象。如果定义和初始化在头文件中可见,这应该和宏一样好。 -
预处理器被解析一次并且不是递归的,那么不可能有你写的东西。最简单的解决方案是定义您必须使用的 CPU 函数中的所有值的经典方法!
标签: c embedded c-preprocessor microcontroller