我知道通常,函数指针声明如下:
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
,只是使用函数指针,这是一种奇怪的由内而外的语法,其中新名称实际上是整个表达的中间。更不用说返回函数指针的函数的符号......
答案 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_t
和unsigned int
可以互换使用而没有编译器投诉的原因,例如)。因此,对于经常使用的函数指针类型,typedef使它们更容易使用。
对于函数指针typedef,语法为:
typedef IObject * (*CreateFunc )(int, Core *);
在内部使用所需的类型名称(与您现在正在执行的操作没有太大区别)。您可以指定大多数函数修饰符(__stdcall,__ declspec等),它们位于* name
之前的括号内。
您可以非常轻松地调用,分配和获取这些值,并将它们转换为void *
以便传递(当类型未知时)。