在循环中连接 c 中的宏

concatenate macros in c in a loop

我想连接很多宏,以便将它们作为参数传递到一个被击中的数组中。更具体地说,我有这个结构

static struct
{
 unsigned int num_irqs;
 volatile __int_handler *_int_line_handler_table;
}_int_handler_table[INTR_GROUPS];

我想作为 num_irqs 参数传递一系列宏

AVR32_INTC_NUM_IRQS_PER_GRP1

AVR32_INTC_NUM_IRQS_PER_GRP2
...

首先我想到使用这个代码

for (int i=0;i<INTR_GROUPS;i++)
{
   _int_handler_table[i].num_irqs = TPASTE2(AVR32_INTC_NUM_IRQS_PER_GRP,i); 
}

但它每次都将 i 作为 char 而不是特定值。我还看到 preprocessor.h 中定义了一个 MREPEAT 宏,但我不明白示例中它是如何使用的。

任何人都可以解释使用 MREPEAT 或其他方法来完成上述操作。

C 不是那样工作的。

宏只是在编译时发生的文本替换。您不能编写代码来构造宏名称,那没有意义。当您的代码运行时,编译器不再存在。

除非代码量非常大(在这种情况下,代码生成是一种常见的解决方案),否则您可能应该手动完成。

请记住预处理器(操作宏)在编译器之前运行。它旨在操纵要提交给编译器的最终源代码。

因此,它不知道什么值有变量。对于预处理器,i 表示 i.

您尝试做的事情有点复杂,尤其要记住预处理器无法生成预处理器指令。

但是它可以生成常量。 说到这一点,对于您的用例,我更愿意使用 table 常量,例如 :

const int AVR32_INTC_NUM_IRQS_PER_GRP[] = { 1, 2, 3, 4, 5 };

for (int i=0;i<INTR_GROUPS;i++)
{
   _int_handler_table[i].num_irqs = TPASTE2(AVR32_INTC_NUM_IRQS_PER_GRP[i]); 
}