正文
大家好,我是bug菌~ 1
#define与#undef
今天分享一个c语言宏定义小技巧,从语法上来看比较简单,不过一旦真正领悟到其精妙之处不仅可以简化代码、还能提高代码的可扩展性。x-macro宏技术的核心在于灵活的应用#define与#undef,对于玩c语言的伙计#define是再熟悉不过了,但#undef却鲜有人在实际的开发过程中熟练使用,基本上都是#define走天下。那#define的作用域是怎样的呢?其作用范围都是从宏定义处到文件结束,不管函数内外均可以随意使用。那一不小心使用#define重复定义相同的宏又会怎样呢?对于大部分编译器会报重复定义警告,但也有小部分编译器采用最近的宏定义直接通过,所以稍不留神就把bug引入到了代码中。其实对于c语言编程素养良好的工程师们多会使用#undef来限制宏定义的作用范围,即取消宏定义,以免造成宏泛滥。 1#include 2#include 3 4#define hello_bug 100 5 6int main(int argc, char *argv[]) { 7 8 printf(hello bug %d,hello_bug); 910#undef hello_bug1112 printf(hello bug %d,hello_bug);13 return 0;14} 如上代码所示,便会编译报错,提示第二条打印语句hello_bug宏未定义。 2
x-macro
x-macro平时我们也叫x宏,其实在bug菌之前的文章有一个简单的提及,今天单独拧出来简化讲讲。 1#define x_macro(a, b) a 2//do something 3#undef x_macro 4 5#define x_macro(a, b) b 6//do something 7#undef x_macro
如上是x-macro的比较精华的几句,通过#define与#undef的配合,可以使用相同的宏名称选择性的替换出我们想要的结构,从而达到简化代码的目的。同时我们也非常清楚,由于宏主要是靠编译器来处理,所以x-macro技巧也主要是在编译阶段来维护代码。下面来一波操作看看效果吧: 1/*************消息定义**********/ 2#define msg_table 3 x_macros(user_msg1, msgproc1) 4 x_macros(user_msg2, msgproc2) 5 x_macros(user_msg3, msgproc3) 6 7/*************消息枚举定义**********/ 8typedef enum { 9 #define x_macros(a, b) a,10 msg_table11 #undef x_macros12 msg_max 13} msg_type;1415/*************消息处理定义**********/16const proc proc_table[] = {17 #define x_macros(a, b) b,18 msg_table19 #undef x_macros 20};2122/*************实际使用**********/23void smessageproc(msg_type msgtype)24{25 (proc_table[msgtype])();26} 当然x-macro还可以扩展多个参数来供序列化替换,同时x-macro宏定义也可以更加的复杂。比如使用#define x_macros(a, b) #a宏来处理为字符串等。
射频技术——下一代WLAN的关键
苹果因侵犯两项与蓝牙技术有关的专利被起诉 此前三星也被起诉并被索赔1110万美元
阿玛尼EA Connected智能腕表评测:轻松智能更时尚!
1~7号电池怎么区分?
SMT贴片加工再流焊注意事项与紧急情况
C语言宏定义小技巧
机器人企业需要提前为AR时代的广告营销做准备
通用型PLC的硬件基本结构
日本将与美国合作预计2025财年启动本土2nm半导体制造基地
三星S8国行真机现身 和iPhone 7红色版比哪个好看?
电源性能指标:额定电压输出电流怎么测试?
IPV6如何和物联网牵手
2012年度高科技行业十大热点新闻:苹果三星专利之争
全球永磁电机行业发展概况与市场趋势分析 电机永磁化仍将持续
边缘处理点到自定义SoC
镀铬、镀镍和镀锌三种电镀的区别
Soitec成立30年,优化衬底焕发新生,迎通信、汽车、智能设备强劲增长
声光控制电路的制作
便携式三维扫描仪反光标记点
滨松涡旋光解决方案 :空间光调制器LCOS-SLM和科研相机