预处理指令
程序员所编写的代码并不能被真正编译器所编译,所以需要一段程序把代码翻译一下。
翻译的过程叫做预处理,被翻译的代码叫做预处理指令,以#开头的都是预处理指令。
查看预处理的结果:
gcc -E code.c 直接把预处理结果显示到终端上
gcc -E code.c -o code.i 把预处理的结果储存到code.i 文件中
预处理指令的分类:
#include 文件包含
#include <> 从系统指定的目录下查找并导入头文件
#include “” 先从文件当前目录下查找,找到了就导入该头文件;如果找不到,再从系统指定的目录下查找 并导入头文件
操作系统通过环境变量来指定头文件的查找路径,或者通过设置编译参数来指定头文件的查找路径 -I /path
.bashrc
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/home/ubuntu/C/day13
#define 定义宏
宏常量: #define MAX 100
优点:提高代码的扩展性(方便批量修改)、提高可读性、提高安全性、还可以在case后面使用 case MAX:
注意:一般宏名全部大写,末尾不要加分号
【局部变量全部大写、全局变量首字母大写、指针变量+p、数组arr、字符串str、函数名全部小写加下划 线】
预定义好的宏:
__ func __ 获取函数名
__ FILE __ 文件名
__ LINE __ 当前符号
__ DATE __ 当前日期
__ TIME __ 运行时间
宏函数:
其实就是带参数的宏
宏函数并不是真正的函数,不检查参数类型,没有传参,没有返回值,只有计算的结果。
1、把代码使用到的宏函数替换为,宏函数后面的代码
2、再把宏函数代码中使用到的参数替换为调用者提供的参数
宏函数的二义性:
由于宏函数所处的位置、参数不同导致宏有不同的功能,这叫做宏的二义性
如何避免二义性:
1、宏函数整体加小括号,每个参数都加小括号
2、使用宏函数时,不要提供带自变运算符的变量作为参数
注意:容易出选择题,例如:哪个宏有二义性、宏函数的计算结果
运算符:
# 把宏函数的参数变成字符串
## 合并两个参数变成标识符 (连接)
条件编译:
根据条件决定哪些代码是否参与最终的编译
版本控制:
#if
#elif
#else
#endif
头文件卫士: 防止头文件被重复包含
#ifndef FILENAME_H