预处理指令
在C语言中以#开头的语句都叫做预处理指令,因为这些不是标注你的C代码,不能被编译器直接编译,需要一段程序把它翻译成标准的C代码,负责翻译在程序叫做预处理器,翻译的过程叫预处理。
gcc -E code.c //把预处理的结果显示在终端上
gcc -E code.c -o code.i//把预处理的结果存储到文件中
-o 为执行结果重命名
1.文件包含
#include<>从系统指定的路径加载头文件
#include ""先从当前路径加载头文件,如果没有再从系统指定的路径加载头文件,
系统通过设置环境变量来指定加载头文件
-l路径 编译时指定加载头文件的路径
2.头文件卫士,防止头文件被重复包含
#ifndef FILE_H
#define FILE_H
......
......
......
#endif//FILE_H
a.h b.h c.h 三个头文件,b.h包含a.h,c.h包含a.h再包含b.h这样a.h中的内存在c.h中就有了两人份,在而头文件卫士可以解决这种问题。
注意:头文件卫士不能解决循环包含的问题(a.h包含b.h,而b.h又包含a.h),解决方法是把a.h和b.h共用的内存提出来再写一个c.h,然后a.h和b.h都包含c.h
宏定义
宏常量#define PI 3.14 预处理会把代码中的所有宏名替换成它后面的数字。
好处:
- 1 比用变量安全性高
- 2 比直接使用数据的扩展性强
- 2 可以为数据取一个有意义的名字,提高可读性
注意:定义宏不带分号,一般宏名都全部大写
宏函数
#define SUM(a,b) a+b
带参数的宏,并不是真正的函数,只是使用样式与函数一样,其实就是把一个复杂的公式抽象臭一个函数一样的宏,如果宏函数的内容太长可以使用大括号,但不能换行(可以使用续行符|)
预定义的宏
DATE 程序被编译的日期,以“Mmm dd yyyy”格式的字符串标注
__TIME__程序被编译的时间“hh:mm:ss”格式的字符串标注,该时间由asctime返回
__func__指示当前函数名
__FUNCTION__当前使用的函数名
__FILE__当前源文件的文件名,以字符串常量标注
__LINE__当前语句所在的行号,以10进制整数标注