在循环中连接 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]);
}
我想连接很多宏,以便将它们作为参数传递到一个被击中的数组中。更具体地说,我有这个结构
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]);
}