预处理阶段
预处理
宏定义
只是替换文本,需要加上括号,这里很容易掉入坑中,因为先替换后计算
1 | // 变量case |
do…while(0)
用来让多行语句变成非复合语句
1 | // do...while(0) |
条件编译
1 |
|
调试代码巧用条件编译
1 |
|
extern “C”块与条件编译结合,在C/C++混合编程的环境,extern “C”就是告诉编译器按C编译(比如没有C++的函数重载等等),所以这种方法可以保证C/C++的兼容性
1 |
|
宏定义常量与const常量的区别
#define pi 3.1415926
- 编译器处理阶段不同:宏定义常量在预处理阶段展开;const常量在编译运行阶段使用
- 类型和安全检查不同:宏定义常量没有类型检查,仅仅展开;const常量有具体类型,在编译阶段执行类型检查
- 存储方式不同:宏定义常量不分配内存,仅仅是展开而已;const常量会在内存中分配,
- 常量只在类中有效只能用const,而且const数据成员只在某个对象生存期内是常量,对于整个类而言是可变的,因为类可以有多个对象,每个对象的const成员值可以不同(不能在类中初始化const数据成员)
宏定义函数与内联函数的区别
define MAX(a, b) ((a)>(b)?(a):(b))
- 编译器处理阶段不同:宏定义是由预处理器进行宏展开,函数内联是通过编译器来控制实现
- 类型和安全检查不同:宏定义函数没有类型检查
- 存储方式不同:内联函数是代码段,直接嵌入,而宏函数是简单的替换
- 内联函数在普通函数的前面加一个关键字 inline 来标识。编译器对内联函数会在编一阶段将其展开,而不会把它当做一个函数,这大大减少了函数调用的开销,因为函数调用需要函数栈、压栈blabla的
添加inline关键字只是向编译器建议内联,具体是否内联还要看编译器的想法,如果函数内有循环体或switch或代码很长,则很可能不内联
添加inline必须要在定义前,只在声明前添加inline不会内联
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一知半解!