资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,补充(三) 宏 编程 #define 仅是简单替换,而不是作为一个量来使用。,4,简单函数的定义,#define MAX(x, y) (x) (y) ? (x) : (y) 定义简单的函数,便于调用。 注意括号的使用。 不同于inline类型的函数。 仅是简单替换,编译阶段,不检查语法;,5,单行宏的定义,定义单行宏,有下列三种方式: 前加#或后加#,将标记作为一个合法的标识符的一部分。注意,不是字符串。例如: #define A(x) T_#x 则 int A(1) = 10; / 等效于int T_1 = 10; #define A(x) Tx#_ 则 int A(1) = 10; / 等效于int T1_ = 10; 前加#,将标记转换为相应的字符,注意:仅对单一标记转换有效。如: #define B(x) #x 则B(a)即 a,B(1)即 1。但B(abc)无效。 前加#,将标记转换为字符串。如: #define C(x) #x 则C(1+1) 即 “1+1”。,6,多行宏的定义,#define DECLARE_RTTI(thisClass, superClass) virtual const char* GetClassName() const return #thisClass; static int isTypeOf(const char* type) if(!strcmp(#thisClass, type) return 1; return superClass:isTypeOf(type); virtual int isA(const char* type) return thisClass:isTypeOf(type); static thisClass* SafeDownCast(DitkObject* o) if(o ,注意斜杠的使用,最后一行不能用斜杠。,7,条件编译的定义,#ifndef _AAA_H #define _AAA_H /c/c+代码 #endif 可根据编译条件选择不同的程序代码执行。 可嵌套定义。,8,宏定义举例(一),#define MAKE_COMPONENT( C ) ( (IW3D#C*)MakeComponent( #C ) ) 则,IW3DScene* pScene = MAKE_COMPONENT( Scene );将被理解为: pScene = (IW3DScene *)MakeComponent(Scene);,9,宏定义举例(二),#define IMPLEMENT_COMPONENT( I, C ) static IComponent* Component_Factory_#C() return new I; ComponentInfo Component_#C = #C, Component_Factory_#C ;,10,宏定义举例(三),#define SINGLETON_COMPONENT( I ) private: static I* ms_pSingleton; public: static I* GetSingleton() return ms_pSingleton; void SetSingleton() ms_pSingleton = this; void Release() ms_pSingleton = NULL; IComponent:Release(); ,11,宏定义举例(四),#define IMPLEMENT_SINGLETON_COMPONENT( I, C ) I* I:ms_pSingleton = NULL; static IComponent* Component_Factory_#C() if( I:GetSingleton() ) return I:GetSingleton(); I* pCom = new I; Assert( pCom ); pCom-SetSingleton(); return pCom; ComponentInfo Component_#C = #C, Component_Factory_#C ;,12,宏定义举例(五),#ifdef _DEBUG #define UNDER_MEMORY_MGR( C ) void* operator new( unsigned int size ) char szFile256; strcpy( szFile, _FILE_ ); strcat( szFile, - ); strcat( szFile, #C ); return GlobalMemory.Alloc( size, szFile, _LINE_ ); void operator delete( void* ptr ) _MemFree( ptr ); #else #define UNDER_MEMORY_MGR( C ) void* operator new( unsigned int size ) return _MemAlloc( size ); void operator delete( void* ptr ) _MemFree( ptr ); #endif,13,宏定义举例(六),#ifdef _DEBUG #define CHECK_PTR_RETURN( ptr ) if( NULL = (ptr) ) Assert( 0 ); return FALSE; #else #define CHECK_PTR_RETURN( ptr ) if( NULL = (ptr) ) return FALSE; #endif / #ifdef _DEBUG,14,宏定义举例(应用),class IComponent public: UNDER_MEMORY_MGR( IComponent ); IComponent() : m_nReferenceCount( 0 ) / / IComponent() / protected: virtual IComponent() /IComponent private: int m_nReferenceCount; /RemoveItem( ); m_pWorld -RemoveEffect( ); m_pWorld -Draw( );,18,常用调试技巧,请参考程序演示,结合程序示例讲解常用的调试技术: Console 方式 Logger File 方式 MessageBox 方式 定制全局调试与软件日志工具,提供DEBUG_OUT 和 ASSERT。,19,小 结,C+中提供的宏具有非常强大的功能,在软件开发过程中巧妙的运用它,可实现软件代码级的简化、封装和重用。 在软件开发过程中,需要定制各种小工具,实现模块公共功能的复用和易用,其中编码过程中的Bug调试工具就是非常重要的一种类型。,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号