当前位置: 首页 > 科技观察

C语言X-MACRO宏使用技巧

时间:2023-03-12 06:39:23 科技观察

1、#define和#undefX-MACRO宏技术的核心在于#define和#undef的灵活运用,对于玩C语言的人来说#define是很熟悉的,但是在实际开发过程中很少能熟练使用#undef,基本上全世界都在用#define。#define的范围是什么?它的作用范围是从宏定义到文件结束,无论在函数内还是函数外都可以自由使用。如果您不小心使用#define重复定义同一个宏会怎样?对于大部分编译器来说,会报重复定义警告,但也有少部分编译器使用最新的宏定义直接pass,稍有不慎就会在代码中引入bug。事实上,具有良好C语言编程素养的工程师经常使用#undef来限制宏定义的范围,即取消宏定义以避免宏泛滥。1#include2#include34#defineHELLO_BUG10056intmain(intargc,char*argv[]){78printf("hellobug%d\r\n",HELLO_BUG);910#undefHELLO_BUG1112printf("hellobug%d\r\n",HELLO_BUG);13return0;14}如上代码所示,会编译报错,提示第二个print语句HELLO_BUG宏是没有定义的。2.X-MACROX-MACRO通常称为“X宏”。其实bug之前在《C程序中管理flags的三种方式,最后一种更好~》一文中有简单的提及。今天单独拧开,简单说一下。1#defineX_MACRO(a,b)a2//dosomething3#undefX_MACRO45#defineX_MACRO(a,b)b6//dosomething7#undefX_MACRO以上就是X-MACRO的本质,通过#define和#配合undef的配合,可以使用相同的宏名来选择性的替换我们想要的结构,从而简化代码。同时我们也很清楚,由于宏主要是由编译器处理的,所以X-MACRO技术主要是在编译阶段维护代码。来看看效果:1/**************MessageDefinition************/2#defineMSG_TABLE\3X_MACROS(USER_MSG1,MsgProc1)\4X_MACROS(USER_MSG2,MsgProc2)\5X_MACROS(USER_MSG3,MsgProc3)\67/***************消息枚举定义************/8typedefenum{9#defineX_MACROS(a,b)a,10MSG_TABLE11#undefX_MACROS12MSG_MAX13}MSG_TYPE;1415/************消息处理定义************/16constProcProc_table[]={17#defineX_MACROS(a,b)b,18MSG_TABLE19#undefX_MACROS20};2122/************************************************/23voidsMessageProc(MSG_TYPEmsgtype)24{25(Proc_table[msgtype])();26}当然X-MACRO也可以扩展多个参数进行序列化替换,X-MACRO的宏定义也可以更复杂。比如使用#defineX_MACROS(a,b)#a宏将其作为字符串处理等。