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

  • 相关阅读:
    set转成toarray()
    list和set的拉拉扯扯的关系
    【转载】VNC和远程桌面的区别
    笔记本最小安装centos7 连接WiFi的方法
    mysql 索引优化 性能调优 锁
    PageHelper 自动去掉排序参数问题
    抽奖算法 百万次抽奖 单线程环境下 约 3.5 秒
    gitlab 安装和使用
    sharding sphere 分表分库 读写分离
    mycat 安装 分表 分库 读写分离
  • 原文地址:https://www.cnblogs.com/fjut/p/2572351.html
Copyright © 2011-2022 走看看