条例1:使用const和inline替代#define

define

1.我们常常用#define实现这样一个常量宏声明:
  #define MAX 1000

这样在预处理的时候,程序会自动将所有的MAX替换成1000这个数字,在符号表中将不会有MAX这个符号,那么编译器将不会看到MAX这个符号。所以当程序编译出错,又恰好在MAX这里出错的时候,编译器报错也只会报1000这个信息出错,如果在数字使用非常多的情况下,一时间往往无法让人联想到是MAX这里出错,这样给程序调试增加了不少困难。

2.功能宏定义

define比较常用的另一个用法就是用来实现宏定义,目的是提高程序的运行效率,简化程序编写,用代码替换的方式实现了函数的功能,又不用像函数一样需要调用,花费内存运算资源。但是宏定义有很多缺陷

写宏体时对每个参数都要加上括号如下代码:
  #define MAX(a,b) (a)>(b)?(a):(b)  
否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦。如下定义:
#define MAX(a,b) a>b?a:b 
void main(){
int a = 5, b = 7,c=8;
int d = c+MAX(a,b);
cout<<d<<endl;
}
我想这里的程序目的是想用ab比较,得出最大值再加上c然后才赋值给d,但是这里因为直接替换代码,将会变成
int d = c + a>b?a:b;

可想而知,程序运行时会先执行c+a,然后才会开始比较,得出的结果与想得到的不一样。

但是即使你象这样做了,还会有问题发生:
#define max(a,b) ((a) > (b) ? (a) : (b))
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次

const

运用const代替define进行常量定义
const int MAX = 1000;
这样不用预处理宏而用的常量定义,编译器就能知道MAX这个符号了。

inline

通过inline,你可以用普通函数实现宏的效率,再加上可预计的行为和类型安全,这就是内联函数。
inline int max(int a, int b){ return a > b ? a : b; };
如果你需要实现不同的版本,那么模板类也可以帮你实现
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 12,323评论 0 10
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,758评论 0 38
  • (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值. 详细内容: 1、什么是const...
    幽鬼09阅读 3,966评论 0 4
  • 昨夜适合思考,于是我拿出了尘封已久的绘本和画笔。 别看我经常徒步,跑步,到处旅行,瞎折腾,一副闲不下来的样子,其实...
    梦影露电阅读 1,895评论 2 1
  • 差不多花了两个小时画这幅,也是临摹Robert 我个人习惯是每次打个草稿,画个框架再接着分部分画,我这手老是画不好...
    孑孓枳阅读 2,849评论 0 4

友情链接更多精彩内容