用于调用名称以数字结尾的函数的 C 宏

C macro for calling function with names ending with numbers

目前我有一个如下所示的 C 代码:

set_idt_entry(idt, 0, code_segment, &handle_interrupt0, 0, 0xE);
set_idt_entry(idt, 1, code_segment, &handle_interrupt1, 0, 0xE);
set_idt_entry(idt, 2, code_segment, &handle_interrupt2, 0, 0xE);
set_idt_entry(idt, 3, code_segment, &handle_interrupt3, 0, 0xE);
set_idt_entry(idt, 4, code_segment, &handle_interrupt4, 0, 0xE);
set_idt_entry(idt, 5, code_segment, &handle_interrupt5, 0, 0xE);
set_idt_entry(idt, 6, code_segment, &handle_interrupt6, 0, 0xE);
                                .
                                .
                                .

重复调用大约需要 256 行,而且看起来很难看。我一直在尝试想出一个可以以某种方式在循环中解决这个问题的宏。可以做还是留256行代码是我能做的最好的?

您应该将这些变量放在一个数组中。假设这些是 ISR 函数指针,那么它看起来像:

void (*handle_interrupt[256])(void) = { ... };

或者更好的是使用 typedef:

typedef void isr_t (void);
isr_t* handle_interrupt [256] = { ... };

更好的是,假设是嵌入式系统,请确保此 table 最终出现在闪存中:

static isr_t* const handle_interrupt [256] = { ... };

现在为避免此初始化程序列表中的代码重复,请为那些未使用的 ISR 提供​​默认中断向量。例如:

#define handle_default reset_interrupt

然后您可以像这样创建默认初始化列表:

#define def1 handle_default, // note the comma here
#define def2 def1 def1
#define def5 def2 def2 def1
#define def10 def5 def5
... // you get the idea
#define def256 def100 def100 def50 def5 def1

static isr_t* const handle_interrupt [256] = { def256 };

现在我假设其中一些不是默认矢量。在那种情况下,我们可以通过在列表末尾添加额外的指定初始化器来做一个技巧。初始化列表中子表达式的求值顺序未指定,但实际的初始化顺序是从左到右(初始化出现的顺序,C17 6.7.9/19)。像这样:

static isr_t* const handle_interrupt [256] = 
{ 
  def256,
  [ 5] = handle_adc,   // #5 used for custom ADC interrupt
  [10] = handle_spi,   // #10 used for custom SPI interrupt
};

现在 运行- 使用此数组的时间代码将变得微不足道:

for(size_t i=0; i<256; i++)
  set_idt_entry(idt, 0, code_segment, &handle_interrupt[i], 0, 0xE);