gpt4 book ai didi

c++ - 理解C函数回调的typedef语法

转载 作者:行者123 更新时间:2023-12-01 14:03:45 25 4
gpt4 key购买 nike

#include <iostream>

typedef char (*callback)(int *data);
typedef char (callback2)(int *data);
typedef char callback3(int *data);

char fun_a(int *d)
{
if (*d == 10)
return 'A';
else
return 'B';
}

int main()
{
int num = 10;
callback cb_1_a;
cb_1_a = fun_a;
std::cout << cb_1_a(&num) << std::endl;

callback cb_1_b;
cb_1_b = &fun_a;
std::cout << cb_1_b(&num) << std::endl;

callback cb_1_c;
cb_1_c = &fun_a;
std::cout << (*cb_1_c)(&num) << std::endl;

/*
callback2 cb2;
cb2 = fun_a; // wrong

callback3 cb3;
cb3 = fun_a; // wrong
*/

return 0;
}

C++ 编译器不会提示 callback2 的 typedef和 callback3 .

问题> 怎么办 typedef char (callback2)(int *data)typedef char (callback3)(int *data)意思?是否有可以应用它们的用例?

最佳答案

您的第一个 typedef定义 callback作为指向接受 int* 的函数的指针参数并返回 char值(value)。因此,作为一个指针,您可以为该类型的变量分配一个值(适当函数的地址),就像您在 cb_1_a 的情况下所做的那样。 , cb_1_bcb_1_c变量;在第一种情况下( cb_1_a = fun_a; ),您使用的是函数名(但注意:没有括号)代替显式 &运算符(如果您在函数名称后添加括号,则您正在调用该函数)。

您的第二个和第三个 typedef语句将它们的类型定义为实际函数,并且不能为函数赋值。另外,因为你只有名字 callback2typedef char (callback2)(int* data); 中的第一组括号内,那些括号实际上是多余的,类型等同于下一行中定义的类型:typedef char callback3(int* data); .

但是,您可以通过添加 * 来(间接地)使用后两种类型来声明函数指针。在相关的变量声明中,像这样:

    //...
callback2 *cb2; // cb2 is now a POINTER to a "callback2" type!
cb2 = fun_a; // So this is OK - We assign the ADDRESS of fun_a to the cb2 pointer
callback3 *cb3; // And the same here...
cb3 = fun_a; // ...and here
//...

随时要求进一步澄清和/或解释。此外,在使用 typedef 方面,您可能会发现这篇文章很有帮助。和函数指针语法: Typedef function pointer?

关于c++ - 理解C函数回调的typedef语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61466465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com