[导读]今天分享一个C语言宏定义小技巧,从语法上来看比较简单,不过一旦真正领悟到其精妙之处不仅可以简化代码、还能提高代码的可扩展性。X-MACRO宏技术的核心在于灵活的应用#define与#undef,对于玩C语言的伙计#define是再熟悉不过了,但#undef却鲜有人在实际的开发过程中熟练使用,基本上都是#define走天下。那#define的作用域是怎样的呢?其作用范围都是从宏定义处到文件结束,不管函数内外均可以随意使用。那一不小心使用#define重复定义相同的宏又会怎样呢?对于大部分编译器会报重复定义警告,但也有小部分编译器采用最近的宏定义直接通过,所以稍不留神就把bug引入到了代码中。其实对于C语言编程素养良好的工程师们多会使用#undef来限制宏定义的作用范围,即取消宏定义,以免造成宏泛滥。
正文
大家好,我是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\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宏来处理为字符串等。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...
关键字:
嵌入式开发
C语言
近日某厂员工爆料,公司程序员因线上流量异常BUG事故,被公司进行处罚。处罚的结果是被要求将去年发的 4 万多年终奖归还给公司,否则就收取滞纳金并辞退,逾期将以每天万分之 5 的利息收取滞纳金。
关键字:
程序员
BUG
事故
年终奖
工程师
近日,运营商乱收费冲上热搜!一名刚被辞退的工程师向河南电视台都市频道节目爆料了联通公司业务创收的丑闻。
关键字:
工程师
运营商
光猫
联通
本文中,小编将对嵌入式软件/硬件工程师予以介绍,如果你想对嵌入式软件/硬件工程师的详细情况有所认识,或者想要增进对嵌入式的了解程度,不妨请看以下内容哦。
关键字:
嵌入式
嵌入式软件工程师
硬件工程师
工程师
Java语言和C语言是两种不同的编程语言,它们在语法、特性和应用领域上有许多差别。下面将详细介绍Java语言和C语言之间的差异以及它们各自的技术特点。
关键字:
Java语言
C语言
编程
嵌入式系统是一种专门设计用于特定应用领域的计算机系统,它通常由硬件和软件组成,并且被嵌入到其他设备或系统中,以实现特定的功能。在嵌入式系统的开发过程中,选择适合的编程语言是至关重要的。C语言是一种被广泛应用于嵌入式系统开...
关键字:
嵌入式
计算机
C语言
C语言是一种广泛应用于软件开发领域的编程语言。它是由贝尔实验室的Dennis Ritchie在20世纪70年代初创建的,旨在为UNIX操作系统的开发提供一种高级编程语言。C语言具有简洁、高效、可移植性强等特点,因此成为了...
关键字:
C语言
操作系统
应用程序
嵌入式系统是现代生活中无处不在的一部分。它们包括了我们的家电、汽车、智能手机、医疗设备等等。这些系统的工作必须高效、可靠,因为它们往往控制着生活中的关键方面。而C语言作为一种广泛用于嵌入式系统开发的编程语言,其质量和稳定...
关键字:
嵌入式系统
C语言
编程
在嵌入式系统开发领域中,C语言是使用最广泛的编程语言之一。它具有高效、灵活和可移植的特点,成为嵌入式系统设计师的首选语言。本文将介绍C语言编程的基本概念、特点以及在嵌入式系统开发中的应用。
关键字:
嵌入式系统
C语言
编程
C语言编译器是一种用于将C语言源代码转换为可执行程序的软件工具。它的主要功能是将C语言代码翻译成机器语言,以便计算机能够理解和执行。C语言编译器通常包括预处理器、编译器、汇编器和链接器等多个组件,它们协同工作以完成编译过...
关键字:
C语言
编译器
Microsoft Visual C++
济南2023年9月18日 /美通社/ -- 9月15日,山东省平台经济协会成立大会在浪潮科技园举行,浪潮云洲当选山东省平台经济协会会长单位,浪潮集团执行总裁、总工程师,浪潮云洲工业互联网董事长肖雪当选山东省平台经济协会会...
关键字:
工业互联网
供应链
数字经济
工程师
(全球TMT2023年9月1日新年)由台达赞助并深度参与的IEEE PELS全球青年学者与学生论坛(SYPS),8月27日至29日于上海举行。本届论坛以“打造全球青年学者与学生交流平台,与行业领袖交流、享受乐趣”为主题...
关键字:
工程师
IEEE
LLC
串联谐振
广州2023年8月30日 /美通社/ -- 8月29日,2023年广东省首席质量官经验交流会暨“质量月”活动在广州启动。活动上,李锦记作为企业首席质量官质量变革创新典型案例创作单位获颁牌匾,李锦记(新会)食品有限公司食品...
关键字:
金属
工程师
BSP
AN
上海2023年8月21日 /美通社/ -- 威图2023年首届卓越工程师大赛于8月21日正式开启,邀请诸位电气领域专业选手前来挑战。威图立足电气行业现状,结合当下热门话题,开启专业竞赛平台,选手们可与众多行业专家共同探讨...
关键字:
大赛
工程师
ST
AI
上海2023年8月11日 /美通社/ -- 申克Centrio超速试验设备源于德国的核心研发技术和精益求精的设计理念,专门为电动汽车转子、喷气发动机、燃气轮机、涡轮压缩机、涡轮增压器、通风机、换向器、汽车联轴器、HSG研...
关键字:
RIO
CE
测试
工程师
8月11日,一则“女工程师为出轨对象成为间谍17年”的话题冲上热搜第一。该案件引起了广泛的社会关注和讨论,并引发了人们对于间谍活动的思考和反思。
关键字:
工程师
7月21日晚间,一则“44岁工程师因讨薪在前东家坠亡”的话题迅速登上热搜。虽然公司辞退员工的事情屡见不鲜,但这件事疑点有很多!
关键字:
工程师
Matlab和C语言的区别是:1、用途不同;2、语法不同;3、运行速度不同;4、可移植性不同;5、代码管理不同。Matlab是一种数值计算和科学计算工具
关键字:
matlab语言
C语言
系统编程
单片机是一种集成电路,它包含了中央处理器、存储器、输入输出接口和时钟等基本部件。单片机广泛应用于各种电子设备中,如家用电器、汽车电子、医疗设备等。单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用...
关键字:
单片机编程
单片机
C语言
一直以来,嵌入式都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来嵌入式的相关介绍,详细内容请看下文。
关键字:
嵌入式
C语言