(1)C++中的 const 常量可以替代宏常数定义,如:
const int A = 3; //等价于 #define A 3
(2)C++中是否有解决方案,可以用来替代宏代码片段呢?
(1)C++编译器可以将一个函数进行内联编译,被 C++编译器内联编译的函数叫内联函数。
(2)C++中使用 inline 关键字声明内联函数。如
inline int func(int a, int b) { return a < b ? a : b; }
(3)内联函数声明时 inline 关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。(在 vs2013 下,inline 放在声明或定义前均可以)
(1)C++编译器直接将内联函数的函数体插入到函数调用的地方
(2)内联函数没有普通函数调用时的额外开销(压栈、跳转、返回)
(3)C++中推荐使用内联函数替代宏代码片段。
(4)C++编译器也不一定满足函数的内联请求。
#include <stdio.h> #define FUNC(a, b) ((a) < (b) ? (a) : (b)) //MSVC下:要让inline、__forceinline生效必须得做如下的设置: //①在“项目”→“配置属性”→“C / C++” →“优化”→“内联函数扩展”中选择“只适用于__inline(/ Ob1)” //②在“配置属性”→“C / C++” →“所有选项”→“调试信息格式”中选择“程序数据库( / Zi)” //VS2013下,inline可放在声明前或也可放在定义前。或两者前都加 inline int func(int a, int b) { return a < b ? a : b; } int main() { int a = 1; int b = 3; //int c = FUNC(++a, b);//相当于(++a)<(b)?:(++a):(b); //printf("a = %d\n", a); //3 //printf("b = %d\n", b); //3 //printf("c = %d\n", c); //3 int c = func(++a, b); printf("a = %d\n", a);//2 printf("b = %d\n", b);//3 printf("c = %d\n", c);//2 return 0; }
内联函数没嵌入到调用地方(仍为函数调用)
函数体被嵌入到调用的地方
宏 |
内联函数 |
|
处理方式 |
由预处理器处理,只是进行简单的文本替换 |
由编译器处理,会将函数体嵌入到调用的地方。但内联请求也可能被编译器拒绝 |
类型检查 |
不做类型检查 |
具有普通函数的特征,会进行参数和返回类型的检查。 |
副作用 |
有 |
无 |
原文:http://www.cnblogs.com/CoderTian/p/7745766.html