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

  • 相关阅读:
    FastStone Capture(FSCapture) 注册码
    Qt下开发及调用带界面的DLL
    Gin生成证书开启HTTPS
    Gin+Vue3开启nginx gzip但是不生效。
    GIn+Docker+docer-compose
    Go字符串切片
    Vue使用AG Grid嵌套element-plus
    GIN转换UTC时间
    GORM对实现datetime和date类型时间
    (二)PaddleOCR 编译 ocr_system.dll
  • 原文地址:https://www.cnblogs.com/fjut/p/2572351.html
Copyright © 2011-2022 走看看