【问题标题】:typedef void (*MyCallback) : What is it and how to use it? [duplicate]typedef void (*MyCallback) :它是什么以及如何使用它? [复制]
【发布时间】:2014-03-30 23:18:55
【问题描述】:

我是一名 Java 开发人员。

我正在尝试理解一个 C/C++ 项目,我在其中找到了这个:

*.h 文件:

typedef void (*MyCallback) (MyHandle handle, void* context, MyResult result, ... );
int MyMethod(MyHandle handle, void* context, MyCallback cb);

*.cpp 文件:

int MyMethod(MyHandle handle, void* context, MyCallback cb){

   //...

}

我真的不明白它是关于什么的......

谁能向我解释一下“typedef void”是什么意思?我只习惯于简单结构的简单 typedef ......但在这个我可以看到一个可怕的指针(对不起,Java 开发人员的指针恐惧症......)。

此外,我们为什么要使用 typedef?我在MyMethod 函数中看不到MyCallBack 上的任何指针。

我需要理解这段代码的含义。

非常感谢!

【问题讨论】:

标签: c++ pointers typedef void


【解决方案1】:

这个特殊的typedef 引入了一个名为MyCallback 的类型别名,用于“指向函数的指针,该函数采用句柄、上下文和结果并返回void”。如果你有一个以MyCallback 为参数的函数,你可以将一个指向具体回调的指针作为参数传递:

void someFunction(MyCallback callback);
void someCallback(MyHandle handle, void* context, MyResult result, ...);

someFunction(&someCallback);
someFunction( someCallback);   // the & is optional

请注意,这仅在someCallback 是顶级函数或静态成员函数时才有效。非静态成员函数(又名方法)是completely different beasts

如果您只是对 C 声明符语法感到困惑,C++11 允许以下替代方案:

using MyCallback = void (*)(MyHandle handle, void* context, MyResult result,...);

【讨论】:

  • 清晰而简单的答案。 +1
  • 很棒的解释!谢谢:)
【解决方案2】:

在此示例中,MyCallback 描述了指向具有以下签名的函数的指针:它返回 void 并具有指定类型的参数(即(MyHandle handle, void* context, MyResult result, ... ))

在MyMethod中,给出了MyCallback类型的参数,这意味着相应的函数可以被调用为:

(*cb)(handle, context, result, ...)

(句柄、上下文、结果等应该在某个地方定义,并具有与为 MyCallback 提供的参数类型相对应的类型)

【讨论】:

  • 感谢您的示例 +1
【解决方案3】:

这是一个函数指针typedef。

在Java中,你经常有一个带有RunThis()函数之类的接口,然后传递子类对象。

在 C 和 C++ 中,这不是必需的。相反,您可以只传递一个指向函数的指针。

这非常有用,尤其是在 C 中,您需要一种指定方式,例如如何在通用代码中比较不同类型的对象,但没有类。在多线程中说明新线程应该执行什么代码也很有用(参见 pthreads 和 std::thread)。

【讨论】:

  • 感谢您提供这些信息。 +1
猜你喜欢
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多