在C中使用宏的确是一个非常好的代码手段,可以大量的减少代码量,提高阅读性,通过对一些常用代码的归类写成宏,作用巨大.
例如如下代码:
if(((t->flag & S_FLAG1) || (t->flay & S_FLAG2)) && t->type == T_TYPE1)
...
条件部分如果多次使用到,那么我们完全可以写如下的宏
#define IsXXXX(t) (((t->flag & S_FLAG1) || (t->flay & S_FLAG2)) && t->type == T_TYPE1)
这样上面的代码就成了
if(IsXXXX(t))
...
代码少了很多,而且可读性也增加了很多.
还有一个代码,C中分配一个结构,一般如下代码:
p=(STRUCT*)malloc(sizeof(STRUCT));
是否可以更加漂亮呢?创建一个宏,如下:
#define new(t) (t*)malloc(t)
这样上面的代码就变成了
p=new(STRUCT);
是否有C++的风格了?
但是有利必有弊,宏一旦使用不当反而会产生严重的后遗症,下面随意说几点.
1.给宏赋予太强大的功能,几乎所有的编译器以及大部分的IDE无法展开和定位宏中的代码,所以一旦产生错误,很难调试, 如果真的需要最好还是用函数来封装.
2.宏名字起的不当,这是很致命的,会导致代码可读性大大降低,例如随意将前面例子中的IsXXXX定义为a,然后后面的代码中全是一堆的
if(a(t))
如果这样,键盘是少打了,但是已经完全没有了可读性,也许今天写的这个宏,明天你就忘记这个宏是做什么了. 同时过于简单的名字也会导致同名但是功能不同的宏大量出现,使得代码更难看懂.
3.宏的随意undef,这个是一个很不好的习惯,代码量一旦达到了一定程度,会导致极度的混乱.
例如在某个.h文件中定义了IsXXXX,然后在某个.c中如下使用
#undef IsXXXX
#define IsXXXX(t) (((t->flag & S_FLAG3) || (t->flay & S_FLAG4)) && t->type == T_TYPE2)
这个对于以后的维护修改埋下了极大的隐患.
4.重名,说起来这个算是很多编译器的问题,如果将一个宏的名字和一个变量的名字重名了,那么很多的C Compiler默认状态下不会报警或报错.
例如:
int a;
...
#define a b
这种错误有时候简直可以让人发疯!!!
5.宏的嵌套使用,不是不能这么用,由于宏屏蔽了实际代码,如果宏->宏,那么即使你的宏写的够漂亮明了,恐怕天长日久也就忘记里面具体的逻辑,一旦想修改就很麻烦,所以要小心使用.
到了C++年代,宏的使用少了很多,不过模板几乎就是宏的升级.
说起来在MFC中消息映射就是一套极具特色的宏,如果不了解它也就算了,但是当你看懂了就会感叹宏的魔力!
分享到:
相关推荐
信息技术是一把双刃剑-微博新闻-信息技术革命下的双刃剑.docx
信息技术是一把双刃剑 微博新闻-信息技术革命下的双刃剑.docx
《圣剑英雄传II 双刃剑》是金点工作组刚刚推出不久的一款共享RPG。这个游戏和其他的游戏相比,有一个最为特别的地方,那就是游戏完全没有加密,开放一切资源:包括图片,音乐、音效,脚本等等等等。这就意味着,我们...
社会化媒体环境中网络口碑的双刃剑效应--基于品牌危机视角,初言玲,,社会化媒体环境中,企业品牌危机事件频发,形成舆论导向的往往就是一个帖子引起的网络口碑交流,而很多企业没有认识到社会化媒体
宏观·研究框架2020之一:国际贸易分析框架,外循环的“双刃剑”-20200802-申万宏源-61页.pdf
理论上,法官和假释委员会可以识别这种双刃剑现象,并平衡青少年的减轻和加重影响。 但是,当量刑当局依赖算法风险评估(这种做法越来越普遍)时,这种平衡过程可能永远不会发生。 算法风险评估通常以不完全透明的...
最新互联网是柄“双刃剑”-让科学“跑”在谣言前面.doc
基因工程技术是把双刃剑.pdf
互联网是把双刃剑英语作文.docx
宏观·研究框架2020之一:国际贸易分析框架,外循环的“双刃剑”-202008022020精品报告.pdf
它揭示了赋予领导权的双刃剑效应。 在我们的研究中,以234名员工为样本进行了问卷调查,并对收集到的数据进行了统计分析。 结果表明,增强领导能力可以通过挑战压力源积极地影响员工的公民意识,并且可以通过障碍...
但是,对AI(包括机器学习和神经网络)执行网络安全任务的信任是一把双刃剑:它可以大大改善网络安全实践,但也可以促进对AI应用程序本身的新型攻击,这可能带来严重的安全性威胁。 我们认为,对用于网络安全的AI的...
VC PRG游戏:圣剑英雄传2双刃剑源码 文档,打造你自己的RPG,调试时候需要先安装Direct 8.0以上的SDK,否则在编译时会提示找不到DDRAW.h文件,并在开发环境下设置好路径。编译后的游戏运行画面请参见源码截图。
英语作文-互联网是把双刃剑.doc
网络双刃剑作文.doc
什么是云计算?按照美国国家标准技术研究院(NIST) 的定义:云计算(cloud computing)是提供通过便捷、按需的网络接入,访问可配置的计算资源共享池(例如网络、服务器、软件和服务)的模式,这些资源能够被快速提供,只...
圣剑英雄传II双刃剑番外篇(源程序圣剑英雄传II双刃剑番外篇(源程序)
RPG游戏windows引擎 圣剑英雄传II双刃剑源代码 包括了地图编辑器
人工智能是把双刃剑.pdf
人工智能双刃剑效能研究.pdf