C ++函数指针语法

时间:2011-04-05 16:21:14

标签: c++ syntax function-pointers

我知道通常,函数指针声明如下:

 void __stdcall my_func(int i) {} // for assigning

 void (__stdcall * my_ptr)(int) = &my_func;

现在我有几个函数将函数指针作为参数:

 void calling_func(void (__stdcall * callback)(int)) { *callback(1); }

在头文件中,我刚刚删除了该东西的名称:

void calling_func(void (__stdcall *)(int));

和voilá,有用......让我思考:如果那是一个完整的类型声明,那么对于函数指针也不能使用正常的TYPE NAME = VALUE语法吗?

我试图声明:

 ( void (__stdcall *)(int) ) callback = &my_func;

它也编译!为什么不经常使用这个?这种符号有缺陷吗?对我而言,它似乎会大大简化函数指针的使用...也可以在typedef中使用,例如:通常它是typedef OLDNAME NEWNAME,只是使用函数指针,这是一种奇怪的由内而外的语法,其中新名称实际上是整个表达的中间。更不用说返回函数指针的函数的符号......

3 个答案:

答案 0 :(得分:4)

不为我编译。 AFAIK它不是有效的C ++。

你可以假装它!

template <typename T>
struct identity {
   typedef T type;
};

identity<void(*)(int)>::type callback = &my_func;

或使用boost::function(或std::function)之类的东西获得最终胜利。

答案 1 :(得分:4)

这不是声明,它是callback的演员表,然后被分配给。

您确定在范围内没有预先存在的声明吗?

答案 2 :(得分:1)

我更喜欢typedef我的函数指针,并且还没有遇到问题。

Typedef,如果我理解正确的话,就不会将新类型作为另一个的别名(这就是size_tunsigned int可以互换使用而没有编译器投诉的原因,例如)。因此,对于经常使用的函数指针类型,typedef使它们更容易使用。

对于函数指针typedef,语法为:

typedef IObject *    (*CreateFunc )(int, Core *);

在内部使用所需的类型名称(与您现在正在执行的操作没有太大区别)。您可以指定大多数函数修饰符(__stdcall,__ declspec等),它们位于* name之前的括号内。

您可以非常轻松地调用,分配和获取这些值,并将它们转换为void *以便传递(当类型未知时)。