先看一段代码:
问题:
进出 getMax 的开销,比 getMax 函数本身的开销还要大
如果使用宏:
1 #define GETMAX(a,b) ((a)>(b)?(a):(b)) 2 3 int main() { 4 int n1 = GETMAX(1, 2); // 等价于直接写 int n1 = (1)>(2)?(1):(2); 5 return 0; 6 }
宏跟函数的区别:宏是替换;如果使用宏,相当于编译器把宏里面规定的代码直接放到了 使用宏的那里
使用 宏 的问题,举个例子:
1 #define GETMAX(a,b) ((a)>(b)?(a):(b)) 2 3 int main() { 4 int a = 10; 5 int n1 = GETMAX(a++, 2); 6 // 上一行相当于 int n1 = ((a++)>(2)?(a++):(2)); 7 cout << "a = " << a << endl; 8 cout << "n1 = " << n1 << endl; 9 return 0; 10 }
res:
原代码看似只执行了一次 a++,a 应该等于 11,但是运行结果显示 a = 12.
这是因为int n1 = GETMAX(a++,2);
等价于写int n1 = ((a++)>(2)?(a++):(2));
第一次比较的时候,比较的是 a = 10 和 2,随后 a 进行了一次自增变为 11. 然后 n1 被赋值为 11.
n1 被赋值之后,a 又进行了一次自增(第二个 a++ 的位置),此时 a 变为了 12.
既利用了函数传参,又不像函数调用那样的代价:内联函数
内联函数语法:在定义函数前加 inline
1 inline int getMax(int a, int b) { 2 return a > b ? a : b; 3 }
内联函数 通常放在头文件;
如果一个头文件中定义(不是声明)了一个普通函数(不是内联函数),然后这个.h 头文件分别被好几个.cpp 文件包含,那么编译代码时不用过,原因是头文件的普通函数被这几个.cpp重定义了;
而头文件中定义内联函数,然后这个头文件被好几个.cpp 文件包含,就不会出错,因为.cpp 文件在使用内联函数时,相当于直接把内联函数的代码放到了使用内联函数的位置上(相当于宏),也不存在函数调用,开销小(但是如果内联函数过于复杂,开销并不小,甚至比函数调用还大)。
内联函数 和 宏 的区别:
1. inline在编译期间展开(将实参传递给形参,使用函数的代码替换函数的调用);而宏在预处理时进行文本替换
2. 宏定义不检查函数参数和返回值,只是展开;内联函数是真正的函数,会检查参数类型,更安全
(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)
标签:头文件,函数,int,++,n1,内联 From: https://www.cnblogs.com/wjjgame/p/17822052.html