我正在尝试理解函数指针:我知道,为了创建一个指向函数的函数指针(该函数接受一个double并返回一个int,然后初始化为NULL),我会这样做:
int (*fptr) (double) = NULL;
在我使用的代码中,我发现一个与函数指针类似的typedef
typedef int (CALLBACK *C_MP)(double d);
//I know I can use it with the name C_MP:
C_MP(5.5);
(*C_MP)(5.5);
//But then I also find in this code a declaration/definition of a variable of type C_MP like that:
C_MP mycmp = NULL;
// where later mycmd is used like that:
(*mycmp )(1.23);
我对这行代码感到困惑(C_MP mycmp = NULL;)**为什么我可以用mycmd这个名字声明一个C_MP,并且在我的代码中继续使用这个名字?**直到现在,我总是看到人们使用函数指针名称(比如C_MP(5.5)或(*C_MP)(5.5);)
1条答案
按热度按时间ia2d9nvy1#
你的困惑来自一个事实,你知道错了:
这是无效的,你不能使用
C_MP
作为函数的指针,它是一个类型而不是变量。你可以清楚地看到编译器拒绝它(我删除了宏CALLBACK,因为它在这里是无关紧要的):Live code
方案cpp:6:10:错误:从类型'double'到类型'C_MP'的转换无效{aka 'int(*)(double)'} C_MP(5.5);
稍后的用法是正确的,创建并使用
C_MP
类型的变量。为了更容易理解,请看以下示例:
在您的例子中,
C_MP
是类型“接受double并返回int的函数指针”的别名(带有宏CALLBACK
的一些额外功能),而不是指针本身。