c - 如何用宏调用只有后缀不同的函数?

标签 c macros

其实我用宏定义了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/

相关文章:

c - 在 C 中处理动态整数类型?

date - 本地时间的 make-timestamp 宏的使用

c++ - namespace 别名与定义的实际优势

scala - Reifying 函数实现而不是引用

c - 如何判断数组中是否有两个相等的数字

c - 当已经指定了 ai_socktype 时调用 getaddrinfo() 时 ai_protocol 可以在提示中起到什么额外的作用?

c - 如何在表格添加中删除换行符

java - 我如何将 "add"的 c/c++ 包发送到 java ee 开发人员的 eclipse?

c - 通用预处理器宏启用检查

c++ - C++ 宏展开的一个问题