1

cocos2d-x 源代码中有一些处理成员函数指针的代码,如下所示。

...
#define     menu_selector(_SELECTOR)   (SEL_MenuHandler)(&_SELECTOR)
...
typedef void(CCObject::*    SEL_MenuHandler )(CCObject *)
...

我收集的想法是用来menu_selector(<MyClass>::<MyFunction>)获取兼容的函数指针。但我相信使用 C 风格的转换允许他们执行不安全的转换,并导致可能的未定义行为。我在这里错了吗?

刚才我的一位同事对以下代码有疑问

class HelloWorld:public CCObject{

    void function();

}

....., menu_selector(HelloWorld::function)); //last arg to another function call

这段代码在 VS2010 上给出了非法转换错误,因为CCObject *需要一个参数,但在 IOS 或 Android 编译器上却没有(我不确定移动编译器有多旧)。我自己用一些类似的代码对此进行了测试,实际上它可以用 VS2010 编译。

我要问的是,cocos2d-x使用(TYPE)而不是有原因static_cast<TYPE>吗?static_cast会阻止所有此类非法演员。是因为static_cast会阻止从(HelloWorld::*...)to 的转换(CCObject::*...)吗?

编辑:派生类函数指针到基类函数指针的转换static_cast 似乎是合法的,所以我不知道他们为什么选择(TYPE).

4

0 回答 0