我正在研究一个AVR,这些库包括设备中断向量,如使用预处理器的TCD0_OVF_vectTCD0_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将连接XY作为单个标识符。
在您的特定情况下,您需要将TCD0_CCA_vect连接到单个标识符中。
注意,这不适用于变量!

关于c - 从零件建立宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19590348/

10-11 15:13