C语言宏定义小技巧

嵌入式技术

1368人已加入

描述

正文


大家好,我是bug菌~

1

#define与#undef

今天分享一个C语言宏定义小技巧,从语法上来看比较简单,不过一旦真正领悟到其精妙之处不仅可以简化代码、还能提高代码的可扩展性。 X-MACRO宏技术的核心在于灵活的应用#define与#undef,对于玩C语言的伙计#define是再熟悉不过了,但#undef却鲜有人在实际的开发过程中熟练使用,基本上都是#define走天下。 那#define的作用域是怎样的 呢?其作用范围都是从宏定义处到文件结束,不管函数内外均可以随意使用。 那一不小心使用#define重复定义相同的宏又会怎样呢?对于大部分编译器会报重复定义警告,但也有小部分编译器采用最近的宏定义直接通过,所以稍不留神就把bug引入到了代码中。 其实对于C语言编程素养良好的工程师们多会使用#undef来限制宏定义的作用范围,即取消宏定义,以免造成宏泛滥
1#include
            2#include
            34#defineHELLO_BUG 10056intmain(intargc,char*argv[]){78printf("hello bug %d ",HELLO_BUG);910#undefHELLO_BUG1112printf("hello bug %d ",HELLO_BUG);13return0;14}
如上代码所示,便会编译报错,提示第二条打印语句HELLO_BUG宏未定义。

2

X-MACRO

X-MACRO平时我们也叫"X宏",其实在bug菌之前的文章 <三种管理C程序中标志位的方法,最后一种比较秀~> 有一个简单的提及,今天单独拧出来简化讲 讲。

       

1#defineX_MACRO(a, b) a2//do something3#undefX_MACRO45#defineX_MACRO(a, b) b6//do something7#undefX_MACRO

如上是X-MACRO的比较精华的几句,通过#define与#undef的配合,可以使用相同的宏名称选择性的替换出我们想要的结构,从而达到简化代码的目的。同时我们也非常清楚 由于宏主要是靠 编译器 来处理,所以X-MACRO技巧也主要是在编译阶段来 维护代码。 下面来一波操作看看效果吧:
1/*************消息定义**********/2#define MSG_TABLE3X_MACROS(USER_MSG1, MsgProc1)4X_MACROS(USER_MSG2, MsgProc2)5X_MACROS(USER_MSG3, MsgProc3)67/*************消息枚举定义**********/8typedefenum{9#define X_MACROS(a, b) a,10MSG_TABLE11#undef X_MACROS12MSG_MAX13} MSG_TYPE;1415/*************消息处理定义**********/16constProc Proc_table[] = {17#define X_MACROS(a, b) b,18MSG_TABLE19#undef X_MACROS20};2122/*************实际使用**********/23voidsMessageProc(MSG_TYPE msgtype)24{25(Proc_table[msgtype])();26}
当然X-MACRO还可以扩展多个参数来供序列化替换,同时X-MACRO宏定义也可以更加的复杂。 比如使用#define X_MACROS(a, b) #a宏来处理为字符串等。
  审核编辑:汤梓红
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分