typedef void (SelectorProtocol::*SEL_MenuHandler)(CCObject*);

cocos2d-x工程里面的HelloWorldScene.cpp文件有这么一行:

// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage("CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback));

里面有个回调函数menu_selector(HelloWorld::menuCloseCallback),平时都是按照他的方式去写的,并不知道里面的实现过程,今天碰到了类似的问题,所以小研究了下。

进入menu_selector()的定义文件 selector_protocol.h 可以看到:

class CCNode;
typedef void (SelectorProtocol::*SEL_SCHEDULE)(ccTime);
typedef void (SelectorProtocol::*SEL_CallFunc)();
typedef void (SelectorProtocol::*SEL_CallFuncN)(CCNode*);
typedef void (SelectorProtocol::*SEL_CallFuncND)(CCNode*, void*);
typedef void (SelectorProtocol::*SEL_CallFuncO)(CCObject*);
typedef void (SelectorProtocol::*SEL_MenuHandler)(CCObject*);
typedef void (SelectorProtocol::*SEL_EventHandler)(CCEvent*);

#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
#define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
#define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)
#define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)
#define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
#define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)

其中:

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

typedef  定义了函数指针类型 SEL_MenuHandler,  该函数的返回值是void, 参数类型是CCObject* 。

#define 了有参数的宏。

所以,在编译预处理时 menu_selector(HelloWorld::menuCloseCallback) 被替换为 (SEL_MenuHandler)(&(HelloWorld::menuCloseCallback))  在编译时,函数指针调用函数并传入参数 &(HelloWorld::menuCloseCallback) 。

原文地址:https://www.cnblogs.com/fjut/p/2572351.html