[英]C++ function pointer syntax
我知道通常,函数指针声明如下:
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
,只是使用函数指针,这是一种奇怪的由内而外的语法,其中新名称实际上在中间整个表达。 更不用说返回函数指针的函数的符号了......
不为我编译。 AFAIK它不是有效的C ++。
不过你可以伪造它!
template <typename T>
struct identity {
typedef T type;
};
identity<void(*)(int)>::type callback = &my_func;
或者使用boost::function
(或std::function
)之类的东西来获得终极胜利。
这不是一个声明,它是一个callback
演员,然后分配给。
您确定您的范围内没有预先存在的声明吗?
我更喜欢使用typedef
我的函数指针,并且还没有遇到问题。
如果我理解正确的话,Typedef不会将新类型作为另一个的别名(这就是为什么size_t
和unsigned int
可以互换使用而不需要编译器投诉)。 因此,对于经常使用的函数指针类型,typedef使它们更容易使用。
对于函数指针typedef,语法为:
typedef IObject * (*CreateFunc )(int, Core *);
在内部使用所需的类型名称(与您现在正在进行的操作没有太大区别)。 您可以指定大多数函数修饰符(__stdcall,__ declspec等),它们只是在* name
之前的括号内。
您可以非常轻松地调用,分配和获取这些值,并将它们转换为void *
以便传递(当类型未知时)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.