C++使用函数指针类型的变量代替函数指针的名称

0s0u357o  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(165)

我正在尝试理解函数指针:我知道,为了创建一个指向函数的函数指针(该函数接受一个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);)

ia2d9nvy

ia2d9nvy1#

你的困惑来自一个事实,你知道错了:

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);

这是无效的,你不能使用C_MP作为函数的指针,它是一个类型而不是变量。你可以清楚地看到编译器拒绝它(我删除了宏CALLBACK,因为它在这里是无关紧要的):

typedef int (*C_MP)(double d);

int main() {
    C_MP(5.5); 
    return 0;
}

Live code
方案cpp:6:10:错误:从类型'double'到类型'C_MP'的转换无效{aka 'int(*)(double)'} C_MP(5.5);
稍后的用法是正确的,创建并使用C_MP类型的变量。
为了更容易理解,请看以下示例:

typedef int myint; // myint is an alias to int
myint = 0; // wrong, you cannot assign to a type;
myint i = 0; // correct you create i of type myint which is alias to int

在您的例子中,C_MP是类型“接受double并返回int的函数指针”的别名(带有宏CALLBACK的一些额外功能),而不是指针本身。

相关问题