c++函数指针语法

C++ function pointer syntax

本文关键字:语法 指针 函数 c++      更新时间:2023-10-16

我知道,一般来说,函数指针是这样声明的:

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

和瞧,那起作用了…并让我思考:如果这是一个完整的类型声明,不能使用正常的TYPE NAME = VALUE语法也为函数指针?

我试图声明:

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

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

这不是一个声明,它是callback的转换,然后赋值给。

你确定在作用域中没有预先存在的声明吗?

不适合我编译。这在c++中是无效的。

你可以假装的!

template <typename T>
struct identity {
   typedef T type;
};
identity<void(*)(int)>::type callback = &my_func;

或者使用boost::function(或std::function)来获得最终的胜利。

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

Typedef,如果我理解正确的话,并没有把一个新类型作为另一个类型的别名(这就是为什么size_tunsigned int可以互换使用而不会引起编译器的抱怨,例如)。因此,对于经常使用的函数指针类型,类型定义使它们更容易使用。

对于函数指针类型,语法如下:

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

在内部使用所需的类型名称(与您现在所做的没有太大不同)。你可以指定大多数函数修饰符(__stdcall, __declspec等),它们就在* name前面的括号里。

您可以很容易地调用,分配和获取这些值,以及将它们转换为void *以传递(当类型未知时)。