C语言中如何获取宏参数的值以调用对应函数?
报错原因
你的代码存在两个核心问题:
- 宏定义写法错误:你写的
#define order(i) fruits_i##_banana()里,参数i和前面的fruits_之间没有拼接符##,预处理时会把fruits_i识别为固定文本,不会把i替换为传入的参数值,就算传常量也无法正确生成函数名。 - 宏仅做预处理期文本替换:C语言宏是预处理阶段的语法,完全不会感知运行时变量的取值。你传入运行时变量
a,预处理时只会直接做文本替换,不会读取a的值是1,最终生成不存在的函数名导致编译报错。
解决方案
场景1:仅用常量/字面量作为宏参数
如果调用宏时传的是数字字面量、宏常量这类预处理期就能确定的内容,调整宏的写法即可正常运行:
// 调整宏定义,用##把参数i和前后的文本拼接 #define order(i) fruits_##i##_banana() #include <stdio.h> void fruits_1_banana() { printf("Order banana\n"); } int main() { // 直接传字面量1,预处理后会正确替换为 fruits_1_banana() order(1); return 0; }
场景2:需要根据运行时变量的值调用对应函数
宏完全做不到运行时取值,这种场景建议用函数指针表实现:
#include <stdio.h> void fruits_1_banana() { printf("Order banana\n"); } void fruits_2_banana() { printf("Order 2 bananas\n"); } // 定义函数指针类型 typedef void (*fruit_func)(void); // 构造函数表,下标对应参数值 fruit_func func_table[] = { NULL, // 下标0占位 fruits_1_banana, fruits_2_banana }; int main() { int a = 1; // 做边界校验后用变量作为下标取函数调用 if (a < sizeof(func_table)/sizeof(func_table[0]) && func_table[a] != NULL) { func_table[a](); } return 0; }
内容的提问来源于stack exchange,提问作者Son
相关产品推荐
相关产品推荐

