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