如何使用宏来调用只有后缀差异的函数?

时间:2017-05-17 03:05:50

标签: c macros

实际上,我使用宏来定义256个中断向量,它们的名称类似于isr_1()isr_2()等等。当我想将他们的地址放到矢量数组uint32_t handlers[256]时,我遇到了一个问题,即使用宏无法解决这些问题。

#define ISR(NUM) isr_##NUM
for(int i = 0; i < 256; i ++){
    handlers[i] = (uint32_t)&ISR(i);
}

但是你知道这是错误的代码。它将扩展为:

for(int i = 0; i < 256; i ++){
    handlers[i] = (uint32_t)&isr_i;
}

没有任何名为isr_i()的函数。所以这是错的。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

宏将无法工作,因为它只是在编译之前执行预处理器期间执行简单的文本连接和替换。循环在运行时发生,因此i的值在预处理器阶段不可用。

我建议不要使用宏来尝试自动完成这样的工作。它很难阅读,并迫使你赋予你的功能非描述性和难以区分名称。

只需使用简单的数组文字就可以达到同样的效果。它更加清晰,因为它并不需要您在阅读代码时尝试精神上描绘宏替换​​的外观。它不会强迫您使用错误的函数名称,它还允许您在源代码中搜索函数名称并查看它们的使用位置。

所以改为

typedef <your-function-sig-here> handler_type;

handler_type handlers[] = 
{
    isr_1,
    isr_2,
    isr_3
}; 

256个条目代表相当大的数组,但我认为它仍然值得这样做。如果您不介意基于数字的函数名称,那么在编译器在其自己的标题中生成数组之前,没有什么能阻止运行不同的工具。