宏定义
宏定义作为C语言里面经常使用的工具,其实就相当于一个标签,在编译预处理时会直接将全部代码中的宏定义进行替换。
在很多方面十分的方便,比如 “ #define MAX(x,y) x > y ? x : y ” 取最大值是十分方便的,但是由于它是预处理时的简单替换,所以会发生一些无法察觉的问题:
#define ADD(x,y) x+y
void test(){
int a= ADD(10, 20) * 10; //希望的结果是300
cout << "a:" << a << endl; //所得的结果却是210
}
//-----------------其实质就是--------------------
void test(){
int a= x + y * 10; //编译器并不会给其加括号
cout << "a:" << a << endl;
}
同样的,自加在宏定义里也要谨慎使用,更不要说是用宏来定义函数了。对于初学者,或者不熟悉项目的程序员,会很容易掉坑里。
#define MULTIPLY(x,y) x*y
void test(){
int n = 10;
int a= MULTIPLY(10,n++) ; //希望的结果是110
cout << "a:" << a << endl; //所得的结果却是100
}
//--------------其实质却是--------------
void test(){
int n = 10;
int a= 10 * n++ ; //先乘后自加
cout << "a:" << a << endl;
}
内联函数
关于内联函数,它却与宏定义不同。C++编译器在编译时也会对内联函数进行错误分析,编译器会将函数类型(包括函数名字,参数类型,返回值类型)放入到堆栈中。它在某种角度上看,也有点像标签。即内联函数在编译时也会直接替换相应的标签,但是内联函数提供给程序员的样子却是一个函数的形式。
可以把内联函数看做是宏定义的高级版本。inline 修饰的函数在运行是没有函数调用的开销的,但是对外又表现出函数的形态。