C语言中如何调用用typedef函数指针定义的宏?
C语言宏定义函数指针的调用方法
你注释中写的FPTR_MACRO(1, 1);就是正确的调用方式,直接取消注释即可正常调用目标地址的函数。
原理说明
你定义的FPTR_MACRO会在预处理阶段被展开为((fptr)0x1234),这个表达式是一个符合fptr类型定义的函数指针。C语言中函数指针的调用语法和普通函数完全一致,直接在指针后追加括号传入参数即可。
如果需要更明确的语义表达,也可以选择显式解引用函数指针的写法,两种写法完全等价:
(*FPTR_MACRO)(1, 1);
注意事项
- 该写法仅适用于明确知晓
0x1234地址处存在对应类型函数的场景(如嵌入式开发、内核调试等),普通用户态程序直接访问绝对内存地址会触发段错误。 - 请确保目标函数的调用约定、参数列表和返回值与你
typedef定义的fptr类型完全匹配,否则会出现未定义行为。
完整代码示例
#include <stdio.h> typedef void (*fptr)(int, int); // 0x1234 为目标函数的入口地址 #define FPTR_MACRO ((fptr)0x1234) void main(void){ // 两种调用方式二选一即可,效果一致 FPTR_MACRO(1, 1); // (*FPTR_MACRO)(1, 1); }
内容的提问来源于stack exchange,提问作者Kung Pao
相关产品推荐
相关产品推荐

