zoukankan      html  css  js  c++  java
  • 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) 。

  • 相关阅读:
    iOS 自动识别URL(链接)功能的实现
    iOS 如何查看崩溃日志
    Swift-- 闭包
    Swift--方法(函数)
    Swift--控制流
    Swift--字典的了解
    数据存储与访问之——SharedPreferences
    汇编指令之STOS、REP
    汇编指令之ADC、SBB、XCHG、MOVS指令
    pushad与popad
  • 原文地址:https://www.cnblogs.com/fjut/p/2572351.html
Copyright © 2011-2022 走看看