宏定义
- #define 是预处理器处理的单元实体之一
- #define 定义的宏可以出现在程序的任意位置
- #define 定义之后的代码都可使用这个宏
#开头的表示他是预处理处理的单元实体之一
宏常量
- #define 定义的宏常量可以直接使用
- #define 定义的宏常量本质为字面量
字面量意味着他不占用任何的内存
#define
并不会占用内存,它只是在编译前做了一个文本替换,不涉及任何存储或运行时的内存分配。
1 |
|
对于预处理器而言,这四个宏定义都是正确的,因为他不会进行语法检查;
对于预处理来说虽然正确,但是替换后的代码是不符合 C 语言语法规范的,因此编译器肯定会报错的(PATH2、PATH3)
宏定义表达式
- #define 表达式的使用类似函数调用
- #define 表达式可以比函数更强大
- #define 表达式比函数更容易出错
1 |
|
宏表达式与函数的对比
宏表达式被预处理器处理,编译器不知道宏表达式的存在(编译器阶段已经被预处理器替换掉了)
宏表达式用”实参“完全代替形参,不进行任何运算
宏表达式**没有任何的”调用“开销
宏表达式中不能出现递归定义
宏没有作用域的概念或者说限制,因为编译器根本不知道宏的存在
内置宏
1 | _FILE_: 被编译的文件名 |
条件编译
同一份代码产生不同的产品
- 条件编译的行为类似于 C 语言中的 if…else…
- 条件编译是预编译指令命令,用于控制是否编译某段代码
1 |
|
#if…#else… 是用来给预编译器执行的
条件编译的本质
- 预编译器根据条件编译指令有选择的删除代码
- 编译器不知道代码分支的存在
- if…else…语句在运行期进行分支判断
- 条件编译指令在预编译期进行分支判断
- 可以通过命令行定义宏
1 | gcc -Dmacro=value file.c // -D 表示宏定义,等价于 #define macro value |
1 | int main() { |
#include的本质
- #include 的本质是将已经存在的文件内容嵌入到当前文件中
- #include 的间接包含,同样会产生嵌入文件内容的操作
包含同样的 #include 可能会产生重复定义的问题,在编译期会导致报错
使用 #ifdef 可以解决这样的问题