C语言X-MACRO宏使用技巧

74a35848f0f2a5c6854213f5aaf87355.gif

正文


大家好,我是bug菌~

1

#define与#undef

今天分享一个C语言宏定义小技巧,从语法上来看比较简单,不过一旦真正领悟到其精妙之处不仅可以简化代码、还能提高代码的可扩展性。

X-MACRO宏技术的核心在于灵活的应用#define与#undef,对于玩C语言的伙计#define是再熟悉不过了,但#undef却鲜有人在实际的开发过程中熟练使用,基本上都是#define走天下。

那#define的作用域是怎样的呢?其作用范围都是从宏定义处到文件结束,不管函数内外均可以随意使用。

那一不小心使用#define重复定义相同的宏又会怎样呢?对于大部分编译器会报重复定义警告,但也有小部分编译器采用最近的宏定义直接通过,所以稍不留神就把bug引入到了代码中。

其实对于C语言编程素养良好的工程师们多会使用#undef来限制宏定义的作用范围,即取消宏定义,以免造成宏泛滥。

1#include <stdio.h>
 2#include <stdlib.h>
 3
 4#define HELLO_BUG   100
 5
 6int main(int argc, char *argv[]) {
 7
 8 printf("hello bug %d\r\n",HELLO_BUG);
 9
10#undef HELLO_BUG
11
12 printf("hello bug %d\r\n",HELLO_BUG);
13 return 0;
14}

如上代码所示,便会编译报错,提示第二条打印语句HELLO_BUG宏未定义。

2

X-MACRO

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

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_TABLE
11    #undef X_MACROS
12    MSG_MAX 
13} MSG_TYPE;
14
15/*************消息处理定义**********/
16const Proc Proc_table[] = {
17    #define X_MACROS(a, b) b,
18    MSG_TABLE
19    #undef X_MACROS 
20};
21
22/*************实际使用**********/
23void sMessageProc(MSG_TYPE msgtype)
24{
25    (Proc_table[msgtype])();
26}

当然X-MACRO还可以扩展多个参数来供序列化替换,同时X-MACRO宏定义也可以更加的复杂。

比如使用#define X_MACROS(a, b) #a宏来处理为字符串等。

最后

    好了,今天就跟大家分享这么多了,技术贵在积累和发现,如果你觉得有所收获,点赞、分享、收藏

最后一个bug,bug菌唯一创作平台~

6a806e99b4832ffe95e35a6be0d3a760.jpeg

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 a38d9a597d38e125e88c54fa21a06d7e.gif

☞  嵌入式C语言进阶专辑 0b7423af368acbdddc4b50f862238293.gif

☞  “bug说”专辑 4aee91800fbacbb47cb7d918db0722b7.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

3fd1b318790425b1a6350cbce0e98022.gif

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值