我正在研究一个AVR,这些库包括设备中断向量,如使用预处理器的TCD0_OVF_vect
和TCD0_CCA_vect
,如下所示:
#define TCD0_OVF_vect_num 77
#define TCD0_OVF_vect _VECTOR(77) /* Overflow Interrupt */
它们还包括计时器对象:
typedef struct TC0_struct
{
register8_t CTRLA; /* Control Register A */
...snip...
} TC0_t;
#define TCD0 (*(TC0_t *) 0x0900) /* 16-bit Timer/Counter 0 */
我希望能够使用类似于
#defines
的语法定义一个宏,该宏将命名计时器对象TCD0
扩展到TCD0_OVF_vect
例如:ISR(VECT(TCD0, CCA_vect)) {}
转换为
ISR(TCD0_CCA_vect) {}
其中
VECT(TCD0, OVF_vect)
是需要展开的宏。有办法吗?
编辑:
此外,我希望能够做到:
#define TIMER TCD0
#define VECT(a, b) ##SOMETHING##
然后能够使用
TCD0_CCA_vect
并以VECT(TIMER, CCA_vect)
结束我知道这需要另一种程度的间接,但我不能完全围绕它。 最佳答案
这很简单:
#define VECT(a, b) a##_##b
X##Y
将连接X
和Y
作为单个标识符。在您的特定情况下,您需要将
TCD0
、_
和CCA_vect
连接到单个标识符中。注意,这不适用于变量!
关于c - 从零件建立宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19590348/