条例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<
我想这里的程序目的是想用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
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

你可能感兴趣的:(条例1:使用const和inline替代#define)