(目 录)
导语
就像你我都知道的一样,C++或者C中,利用宏定义可以帮我们完成许多事情,而且在预处理的时候,进行替换后,对我们程序看起来也没有什么坏处,那么,何必“不建议”呢? 就我认为可以从以下方面取关注这个问题:
1.#define 不经过编译
在程序编译之前,经过预处理的过程,将#define 的宏进行了替换,然后编译,意味着进行编译的是替换后的名称,而不是我们最初使用的原名称,那么当替换后的名称存在常见性的时候,倘若报错,便对报错拍错有很大的迷惑性; 也许文字有点圈圈绕绕,那么借用一个经典例子来说:
#define ASPECT_RATIO 1.653
这样类似的宏,很多时候我们会去使用,在程序预处理的时候,ASPECT_RATIO 被数字1.653代替,不出错则好,日后关于此词条出错,报错信息只是一个数字,那个时候就会很难被想起,只是一个数字1.653, 很多时候是不会直接想起ASPECT_RATIO 的,当你这份代码是被别人拿去运行,出错后看到1.653,人都麻了,这是个什么鬼报错! 那么如果这个时候我们使用
const double ASPECT_RATIO = 1.653;
这样是不可以减少很多麻烦呢? 当然,你也许会问“那我用常量好了,那一个类里要常量呢,你也const?还管用吗?”哈哈,类里常量,咱就用static const 静态常量啊,别忘记了类外定义哦, 另外常量指针的时候,也得注意const的使用,如果是一个常量,那么很大概率会被我们写到.h文件中,那么对于这个指针来说,一要保证指针本身安全,而要保证指向数据安全,那么就需要俩个const的格式了 总结:处于编译过程中,出错便于查询错误
2.#define 一些处理简单逻辑的类似函数功能的部分代码
那我说,有inline不用非要用 #define 宏,那为什么呢 倘若你说人各有志,我就爱用 那我就会说,inline使用时,是对编译器的一个建议,如果认可,那么和宏替换没什么区别,但是函数逻辑肯定不会出问题 那么#define 到底安全吗
#define max(a, b) ((a)>(b)?(a),(b)
都加了()了你不会说我故意写错吧哈哈,那么这样就安全了吗? 如果我们不加(),问题显而易见,加了后
int a = 5, b = 0;
max(++a, b);
max(++a, b+10);
第一个max ,a 的值增加了俩次 第二个max, a的值增加一次 所以这个宏,你敢用吗? 那么使用inline是不是很好呢?答案是肯定的,而且内联也可以设计为模板类型,泛型处理支持此种比较方式的数据类型
所以,多用const和inline哦,当然,目前我们躲不开类似#include这种的,#ifdef/!ifndef 这样的控制编译的角色,但是,计划中要尽可能的少用哦