我是一名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?我在MyCallBack
函数的MyMethod
上没有看到任何指针。
我需要了解这段代码的含义。
非常感谢你!
答案 0 :(得分:7)
这个特殊的typedef
为类型“指向函数的指针引入句柄,上下文和结果以及返回void”引入了一个名为MyCallback
的类型别名。如果你有一个以MyCallback
为参数的函数,你可以将指针作为参数传递给具体的回调函数:
void someFunction(MyCallback callback);
void someCallback(MyHandle handle, void* context, MyResult result, ...);
someFunction(&someCallback);
someFunction( someCallback); // the & is optional
请注意,这仅在someCallback
是顶级函数或静态成员函数时才有效。非静态成员函数(aka方法)是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提供的参数类型相对应的类型)
答案 2 :(得分:1)
这是一个函数指针typedef。
在Java中,你经常有一个带有RunThis()
函数的接口,然后传递子类对象。
在C和C ++中,这不是必需的。相反,你可以只传递一个指向函数的指针。
这非常有用,特别是在你需要一种方法来指定例如如何在通用代码中比较不同类型的对象,但没有类。它在多线程中也很有用,可以说出新线程应该执行什么代码(参见pthreads和std :: thread)。