C++中为何可使用函数指针typedef类型声明变量并调用?
理解函数指针typedef的用法
首先明确:typedef int (CALLBACK *C_MP)(double d); 的作用是给特定函数指针类型创建一个别名,C_MP就等价于int (CALLBACK *)(double)这个复杂的函数指针类型,和int、char这类基础类型的用法完全一致。
核心逻辑拆解
你最初写的函数指针声明:
int (*fptr) (double) = NULL;
这里int (*)(double)是函数指针类型,fptr是该类型的变量。
而通过typedef语句,我们把int (CALLBACK *)(double)这个冗长的类型名,简化成了C_MP。所以:
C_MP mycmp = NULL;
完全等价于:
int (CALLBACK *mycmp)(double) = NULL;
这和你用int x = 0;声明整数变量是同一个逻辑——C_MP就是函数指针类型的别名,用它声明变量是完全合规的操作。
关于你提到的C_MP(5.5)写法
如果代码里只有typedef定义的C_MP,直接写C_MP(5.5)是非法的,因为C_MP是类型名,不是可调用的函数指针变量。你看到的这种写法,大概率是代码里同时存在一个同名的函数指针变量,比如之前有类似定义:
// 先typedef定义类型别名 typedef int (CALLBACK *C_MP)(double d); // 再声明一个同名的函数指针变量 C_MP C_MP = some_callback_function;
这种情况下,C_MP(5.5)才是合法的(调用该变量指向的函数),本质是用变量名调用,和mycmp(5.5)的逻辑完全一致。
补充:函数指针的调用语法
不管是直接用变量名mycmp(1.23),还是解引用后调用(*mycmp)(1.23),在C语言里都是合法的——函数指针在调用时会自动隐式解引用,两种写法效果完全相同。
内容的提问来源于stack exchange,提问作者user3443063
相关产品推荐
相关产品推荐

