您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言宏定义(高级篇)
szfhit@126.com1补充(三)宏编程——#define&常用调试技巧MacroProgrammingUsing#define&GeneralDebugTechnologySpecialIssueforHITMath-07szfhit@126.com2内容简介本部分将主要讲解C++中宏定义的应用——如何利用宏来简化程序设计,实现代码级的简化、封装、重用等。szfhit@126.com3简单常量的定义#defineN1000定义简单的常量,便于修改。切不可在后面加上分号!等效于constintN=1000;仅是简单替换,而不是作为一个量来使用。szfhit@126.com4简单函数的定义#defineMAX(x,y)((x)(y))?(x):(y)定义简单的函数,便于调用。注意括号的使用。不同于inline类型的函数。仅是简单替换,编译阶段,不检查语法;szfhit@126.com5单行宏的定义定义单行宏,有下列三种方式:前加##或后加##,将标记作为一个合法的标识符的一部分。注意,不是字符串。例如:#defineA(x)T_##x则intA(1)=10;//等效于intT_1=10;#defineA(x)Tx##__则intA(1)=10;//等效于intT1__=10;前加#@,将标记转换为相应的字符,注意:仅对单一标记转换有效。如:#defineB(x)#@x则B(a)即‘a’,B(1)即‘1’。但B(abc)无效。前加#,将标记转换为字符串。如:#defineC(x)#x则C(1+1)即“1+1”。szfhit@126.com6多行宏的定义#defineDECLARE_RTTI(thisClass,superClass)\virtualconstchar*GetClassName()const\{return#thisClass;}\staticintisTypeOf(constchar*type){\if(!strcmp(#thisClass,type)\return1;\returnsuperClass::isTypeOf(type);\}\virtualintisA(constchar*type){\returnthisClass::isTypeOf(type);\}\staticthisClass*SafeDownCast(DitkObject*o){\if(o&&o-isA(#thisClass))\returnstatic_castthisClass*(o);\returnNULL;\}注意斜杠的使用,最后一行不能用斜杠。szfhit@126.com7条件编译的定义#ifndef_AAA_H#define_AAA_H//c/c++代码#endif可根据编译条件选择不同的程序代码执行。可嵌套定义。szfhit@126.com8宏定义举例(一)#defineMAKE_COMPONENT(C)\((IW3D##C*)MakeComponent(#C))则,IW3DScene*pScene=MAKE_COMPONENT(Scene);将被理解为:pScene=((IW3DScene*)MakeComponent(Scene);szfhit@126.com9宏定义举例(二)#defineIMPLEMENT_COMPONENT(I,C)\staticIComponent*Component_Factory_##C()\{\returnnewI;\}\ComponentInfoComponent_##C=\{\#C,\Component_Factory_##C\};szfhit@126.com10宏定义举例(三)#defineSINGLETON_COMPONENT(I)\private:\staticI*ms_pSingleton;\public:\staticI*GetSingleton()\{\returnms_pSingleton;\}\voidSetSingleton()\{\ms_pSingleton=this;\}\voidRelease()\{\ms_pSingleton=NULL;\IComponent::Release();\}szfhit@126.com11宏定义举例(四)#defineIMPLEMENT_SINGLETON_COMPONENT(I,C)\I*I::ms_pSingleton=NULL;\staticIComponent*Component_Factory_##C()\{\if(I::GetSingleton())\{\returnI::GetSingleton();\}\I*pCom=newI;\Assert(pCom);\pCom-SetSingleton();\returnpCom;\}\ComponentInfoComponent_##C=\{\#C,\Component_Factory_##C\};szfhit@126.com12宏定义举例(五)#ifdef_DEBUG#defineUNDER_MEMORY_MGR(C)\void*operatornew(unsignedintsize)\{\charszFile[256];\strcpy(szFile,__FILE__);\strcat(szFile,-);\strcat(szFile,#C);\returnGlobalMemory.Alloc(size,szFile,__LINE__);\}\voidoperatordelete(void*ptr)\{\_MemFree(ptr);\}#else#defineUNDER_MEMORY_MGR(C)\void*operatornew(unsignedintsize)\{\return_MemAlloc(size);\}\voidoperatordelete(void*ptr)\{\_MemFree(ptr);\}#endifszfhit@126.com13宏定义举例(六)#ifdef_DEBUG#defineCHECK_PTR_RETURN(ptr)\{\if(NULL==(ptr))\{\Assert(0);\returnFALSE;\}\}#else#defineCHECK_PTR_RETURN(ptr)\{\if(NULL==(ptr))\returnFALSE;\}#endif//#ifdef_DEBUGszfhit@126.com14宏定义举例(应用)classIComponent{public:UNDER_MEMORY_MGR(IComponent);IComponent():m_nReferenceCount(0){//……}//IComponent()//……protected:virtual~IComponent(){}//~IComponentprivate:intm_nReferenceCount;///Referencecounter.friendvoid_ComponentReference(IComponent*pCom);friendvoid_ComponentRelease(IComponent*pCom);};//classIComponentszfhit@126.com15宏定义举例(应用)Contd.classIW3DWorld:publicIComponent{public:virtualvoidRemoveMonster(DWORDdwId)=0;virtualvoidRemoveItem(DWORDdwId)=0;virtualvoidShowItemName(BOOLbShow)=0;//……virtualvoidRemoveEffect(DWORDdwId)=0;virtualvoidDraw()=0;};//classIW3DWorldszfhit@126.com16宏定义举例(应用)Contd.classCW3DWorld:publicIW3DWorld{SINGLETON_COMPONENT(CW3DWorld);public:UNDER_MEMORY_MGR(CW3DWorld);CW3DWorld(){//…}//CW3DWorld//…voidDraw(){//…}//Drawprivate:DWORDm_dwFogColor;///Fogcolor//…};//classCW3DCameraIMPLEMENT_SINGLETON_COMPONENT(CW3DWorld,World);szfhit@126.com17宏定义举例(应用)Contd.在某程序段中定义对象如下:IW3DWorld*m_pWorld;则,可以采用下列简单方法进行初始化:m_pWorld=MAKE_COMPONENT(World);CHECK_PTR_RETURN(m_pWorld);m_pWorld-RemoveMonster(…);m_pWorld-RemoveItem(…);m_pWorld-RemoveEffect(…);m_pWorld-Draw(…);szfhit@126.com18常用调试技巧请参考程序演示,结合程序示例讲解常用的调试技术:Console方式LoggerFile方式MessageBox方式定制全局调试与软件日志工具,提供DEBUG_OUT和ASSERT。szfhit@126.com19小结C++中提供的宏具有非常强大的功能,在软件开发过程中巧妙的运用它,可实现软件代码级的简化、封装和重用。在软件开发过程中,需要定制各种小工具,实现模块公共功能的复用和易用,其中编码过程中的Bug调试工具就是非常重要的一种类型。
本文标题:C语言宏定义(高级篇)
链接地址:https://www.777doc.com/doc-3675805 .html