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

你可能感兴趣的:(selector)