CCPlatformMacros

本文详细介绍了Cocos2dx中使用的各种宏定义,包括平台特定宏、对象创建宏、属性声明宏等,并解释了这些宏如何帮助开发者简化代码编写过程。此外,还提供了关于调试、内存管理和代码保护等方面的实用宏定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef __CC_PLATFORM_MACROS_H__

#define __CC_PLATFORM_MACROS_H__


/**

 * define some platform specific macros

 */

#include "ccConfig.h"

#include "CCPlatformConfig.h"

#include "CCPlatformDefine.h"


/**

 * define a create function for a specific type, such as CCLayer

 * @__TYPE__ class type to add create(), such as CCLayer

 */

#define CREATE_FUNC(__TYPE__) \

static __TYPE__* create() \

{ \

    __TYPE__ *pRet = new __TYPE__(); \

    if (pRet && pRet->init()) \

    { \

        pRet->autorelease(); \

        return pRet; \

    } \

    else \

    { \

        delete pRet; \

        pRet = NULL; \

        return NULL; \

    } \

}


/**

 * define a node function for a specific type, such as CCLayer

 * @__TYPE__ class type to add node(), such as CCLayer

 * @deprecated: This interface will be deprecated sooner or later.

 */

#define NODE_FUNC(__TYPE__) \

CC_DEPRECATED_ATTRIBUTE static __TYPE__* node() \

{ \

    __TYPE__ *pRet = new __TYPE__(); \

    if (pRet && pRet->init()) \

    { \

        pRet->autorelease(); \

        return pRet; \

    } \

    else \

    { \

        delete pRet; \

        pRet = NULL; \

        return NULL; \

    } \

}


/** @def CC_ENABLE_CACHE_TEXTURE_DATA

Enable it if you want to cache the texture data.

Basically, it's only enabled for Emscripten.


It's new in cocos2d-x since v0.99.5

*/

#if (CC_TARGET_PLATFORM == CC_PLATFORM_EMSCRIPTEN)

    #define CC_ENABLE_CACHE_TEXTURE_DATA       1

#else

    #define CC_ENABLE_CACHE_TEXTURE_DATA       0

#endif


#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) || (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_EMSCRIPTEN)

    /* Application will crash in glDrawElements function on some win32 computers and some android devices.

       Indices should be bound again while drawing to avoid this bug.

     */

    #define CC_REBIND_INDICES_BUFFER  1

#else

    #define CC_REBIND_INDICES_BUFFER  0

#endif


// generic macros


// namespace cocos2d {}

#ifdef __cplusplus

    #define NS_CC_BEGIN                     namespace cocos2d {

    #define NS_CC_END                       }

    #define USING_NS_CC                     using namespace cocos2d

#else

    #define NS_CC_BEGIN 

    #define NS_CC_END 

    #define USING_NS_CC 

#endif 


/** CC_PROPERTY_READONLY is used to declare a protected variable.

 We can use getter to read the variable.

 @param varType : the type of variable.

 @param varName : variable name.

 @param funName : "get + funName" is the name of the getter.

 @warning : The getter is a public virtual function, you should rewrite it first.

 The variables and methods declared after CC_PROPERTY_READONLY are all public.

 If you need protected or private, please declare.

 */

#define CC_PROPERTY_READONLY(varType, varName, funName)\

protected: varType varName;\

public: virtual varType get##funName(void);


#define CC_PROPERTY_READONLY_PASS_BY_REF(varType, varName, funName)\

protected: varType varName;\

public: virtual const varType& get##funName(void);


/** CC_PROPERTY is used to declare a protected variable.

 We can use getter to read the variable, and use the setter to change the variable.

 @param varType : the type of variable.

 @param varName : variable name.

 @param funName : "get + funName" is the name of the getter.

 "set + funName" is the name of the setter.

 @warning : The getter and setter are public virtual functions, you should rewrite them first.

 The variables and methods declared after CC_PROPERTY are all public.

 If you need protected or private, please declare.

 */

#define CC_PROPERTY(varType, varName, funName)\

protected: varType varName;\

public: virtual varType get##funName(void);\

public: virtual void set##funName(varType var);


#define CC_PROPERTY_PASS_BY_REF(varType, varName, funName)\

protected: varType varName;\

public: virtual const varType& get##funName(void);\

public: virtual void set##funName(const varType& var);


/** CC_SYNTHESIZE_READONLY is used to declare a protected variable.

 We can use getter to read the variable.

 @param varType : the type of variable.

 @param varName : variable name.

 @param funName : "get + funName" is the name of the getter.

 @warning : The getter is a public inline function.

 The variables and methods declared after CC_SYNTHESIZE_READONLY are all public.

 If you need protected or private, please declare.

 */

#define CC_SYNTHESIZE_READONLY(varType, varName, funName)\

protected: varType varName;\

public: virtual varType get##funName(void) const { return varName; }


#define CC_SYNTHESIZE_READONLY_PASS_BY_REF(varType, varName, funName)\

protected: varType varName;\

public: virtual const varType& get##funName(void) const { return varName; }


/** CC_SYNTHESIZE is used to declare a protected variable.

 We can use getter to read the variable, and use the setter to change the variable.

 @param varType : the type of variable.

 @param varName : variable name.

 @param funName : "get + funName" is the name of the getter.

 "set + funName" is the name of the setter.

 @warning : The getter and setter are public  inline functions.

 The variables and methods declared after CC_SYNTHESIZE are all public.

 If you need protected or private, please declare.

 */

#define CC_SYNTHESIZE(varType, varName, funName)\

protected: varType varName;\

public: virtual varType get##funName(void) const { return varName; }\

public: virtual void set##funName(varType var){ varName = var; }


#define CC_SYNTHESIZE_PASS_BY_REF(varType, varName, funName)\

protected: varType varName;\

public: virtual const varType& get##funName(void) const { return varName; }\

public: virtual void set##funName(const varType& var){ varName = var; }


#define CC_SYNTHESIZE_RETAIN(varType, varName, funName)    \

private: varType varName; \

public: virtual varType get##funName(void) const { return varName; } \

public: virtual void set##funName(varType var)   \

{ \

    if (varName != var) \

    { \

        CC_SAFE_RETAIN(var); \

        CC_SAFE_RELEASE(varName); \

        varName = var; \

    } \


#define CC_SAFE_DELETE(p)            do { if(p) { delete (p); (p) = 0; } } while(0)

#define CC_SAFE_DELETE_ARRAY(p)     do { if(p) { delete[] (p); (p) = 0; } } while(0)

#define CC_SAFE_FREE(p)                do { if(p) { free(p); (p) = 0; } } while(0)

#define CC_SAFE_RELEASE(p)            do { if(p) { (p)->release(); } } while(0)

#define CC_SAFE_RELEASE_NULL(p)        do { if(p) { (p)->release(); (p) = 0; } } while(0)

#define CC_SAFE_RETAIN(p)            do { if(p) { (p)->retain(); } } while(0)

#define CC_BREAK_IF(cond)            if(cond) break


#define __CCLOGWITHFUNCTION(s, ...) \

    CCLog("%s : %s",__FUNCTION__, CCString::createWithFormat(s, ##__VA_ARGS__)->getCString())


// cocos2d debug

#if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0

#define CCLOG(...)       do {} while (0)

#define CCLOGINFO(...)   do {} while (0)

#define CCLOGERROR(...)  do {} while (0)

#define CCLOGWARN(...)   do {} while (0)


#elif COCOS2D_DEBUG == 1

#define CCLOG(format, ...)      cocos2d::CCLog(format, ##__VA_ARGS__)

#define CCLOGERROR(format,...)  cocos2d::CCLog(format, ##__VA_ARGS__)

#define CCLOGINFO(format,...)   do {} while (0)

#define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__)


#elif COCOS2D_DEBUG > 1

#define CCLOG(format, ...)      cocos2d::CCLog(format, ##__VA_ARGS__)

#define CCLOGERROR(format,...)  cocos2d::CCLog(format, ##__VA_ARGS__)

#define CCLOGINFO(format,...)   cocos2d::CCLog(format, ##__VA_ARGS__)

#define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__)

#endif // COCOS2D_DEBUG


// Lua engine debug

#if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0 || CC_LUA_ENGINE_DEBUG == 0

#define LUALOG(...)

#else

#define LUALOG(format, ...)     cocos2d::CCLog(format, ##__VA_ARGS__)

#endif // Lua engine debug


#if defined(__GNUC__) && ((__GNUC__ >= 5) || ((__GNUG__ == 4) && (__GNUC_MINOR__ >= 4))) \

    || (defined(__clang__) && (__clang_major__ >= 3))

#define CC_DISABLE_COPY(Class) \

private: \

    Class(const Class &) = delete; \

    Class &operator =(const Class &) = delete;

#else

#define CC_DISABLE_COPY(Class) \

private: \

    Class(const Class &); \

    Class &operator =(const Class &);

#endif


/*

 * only certain compilers support __attribute__((deprecated))

 */

#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))

    #define CC_DEPRECATED_ATTRIBUTE __attribute__((deprecated))

#elif _MSC_VER >= 1400 //vs 2005 or higher

    #define CC_DEPRECATED_ATTRIBUTE __declspec(deprecated) 

#else

    #define CC_DEPRECATED_ATTRIBUTE

#endif 


/*

 * only certain compiler support __attribute__((format))

 * formatPos - 1-based position of format string argument

 * argPos - 1-based position of first format-dependent argument

 */

#if defined(__GNUC__) && (__GNUC__ >= 4)

#define CC_FORMAT_PRINTF(formatPos, argPos) __attribute__((__format__(printf, formatPos, argPos)))

#elif defined(__has_attribute)

  #if __has_attribute(format)

  #define CC_FORMAT_PRINTF(formatPos, argPos) __attribute__((__format__(printf, formatPos, argPos)))

  #endif // __has_attribute(format)

#else

#define CC_FORMAT_PRINTF(formatPos, argPos)

#endif


#if defined(_MSC_VER)

#define CC_FORMAT_PRINTF_SIZE_T "%08lX"

#else

#define CC_FORMAT_PRINTF_SIZE_T "%08zX"

#endif


#ifdef __GNUC__

#define CC_UNUSED __attribute__ ((unused))

#else

#define CC_UNUSED

#endif


#endif // __CC_PLATFORM_MACROS_H__


转载于:https://www.cnblogs.com/sssssnian/p/3748565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值