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

C 如何使用宏调用只有后缀差异的函数?,c,macros,C,Macros,事实上,我使用宏定义了256个中断向量,它们的名称类似于isr_1(),isr_2()等等。当我想将它们的地址放入向量数组uint32\t处理程序[256]时,我遇到了一个问题,即使用宏无法帮助我解决这些问题 #define ISR(NUM) isr_##NUM for(int i = 0; i < 256; i ++){ handlers[i] = (uint32_t)&ISR(i); } #定义ISR(NUM)ISR#NUM 对于(int i=0;i

事实上,我使用宏定义了256个中断向量,它们的名称类似于
isr_1()
isr_2()
等等。当我想将它们的地址放入向量数组
uint32\t处理程序[256]
时,我遇到了一个问题,即使用宏无法帮助我解决这些问题

#define ISR(NUM) isr_##NUM
for(int i = 0; i < 256; i ++){
    handlers[i] = (uint32_t)&ISR(i);
}
#定义ISR(NUM)ISR#NUM
对于(int i=0;i<256;i++){
处理程序[i]=(uint32_t)和ISR(i);
}
但正如你所知,这是一个错误的代码。它将扩展为:

for(int i = 0; i < 256; i ++){
    handlers[i] = (uint32_t)&isr_i;
}
for(int i=0;i<256;i++){
处理程序[i]=(uint32_t)和isr_i;
}

没有任何名为
isr\u i()
的函数。所以这是错误的。有没有办法解决这个问题

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

我建议不要使用宏来尝试自动化这样的工作。它很难阅读,并迫使您为函数指定非描述性的名称,并且很难区分名称

只需使用一个简单的数组文本,就可以实现相同的效果。这要清楚得多,因为在阅读代码时,它不需要你试着想象宏替换的样子。它不会强迫您使用错误的函数名,还允许您在源代码中搜索函数名并查看它们的使用位置

所以相反

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

handler_type handlers[] = 
{
    isr_1,
    isr_2,
    isr_3
}; 
typedef处理程序\u类型;
处理程序\u类型处理程序[]=
{
isr_1,
isr_2,
isr_3
}; 

256个条目代表了一个相当大的数组,但我认为这样做还是值得的。如果您不介意基于数字的函数名,那么在编译器之前运行不同的工具以在其自己的头中生成数组是不会有任何问题的。

整数值是一个运行时属性,但您所做的是编译时。也许最好的办法是创建函数的查找表。这也将更加清楚。宏只会给图片带来不确定性和不好的可读性。@PaulRooney明白了,谢谢!它也不会强迫您使用像
isr\u 1
这样的深奥函数名。您想给出答案吗?你现在似乎已经落实了@PaulRooney的建议。看起来是一对很有价值的问答组合。@PaulRooney是的,这是一个有用的解决方案!请邮寄;)