其实我用宏定义了256个中断 vector ,它们的名字如isr_1()
、isr_2()
等。当我想将它们的地址放入 vector 数组 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()
的函数。所以这是错误的。有什么办法可以解决这个问题吗?
最佳答案
该宏将不起作用,因为它仅在编译前的预处理器执行期间执行简单的文本连接和替换。循环发生在运行时,因此 i
的值在预处理器阶段不可用。
我建议不要使用宏来尝试自动化这样的工作。它难以阅读,并迫使您为函数赋予非描述性且难以区分名称。
您只需使用一个简单的数组文字即可达到相同的效果。它更清晰,因为它不需要您在阅读代码时尝试并在脑海中想象宏替换的样子。它不会强制您使用错误的函数名称,还允许您在源代码中搜索函数名称并查看它们的使用位置。
所以相反
typedef <your-function-sig-here> handler_type;
handler_type handlers[] =
{
isr_1,
isr_2,
isr_3
};
256 个条目代表了一个相当大的数组,但我认为这样做仍然值得。如果您不介意基于数字的函数名称,那么在编译器在其自己的 header 中生成数组之前,没有什么可以阻止其他工具运行。
关于c - 如何用宏调用只有后缀不同的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44014837/