我们都知道像C语言这样的编译型语言是要经过编译、链接才能形成可执行文件的。其中编译又分为预处理、编译、汇编,今天我们就简谈一下预处理阶段发生事情。
一.预定义符号(可直接使用,在预处理阶段会替换为其代表的信息)
1.__FILE__(当前编译的文件)
2.__DATE__(文件编译的日期)
3.__TIME__(文件编译的时间)
4.__STDC__(若编译器遵循ANSIC,其的值为一,否则是未定义)
5.__LINE__(文件当前的行号)
代码演示(我用的是VS):
二.#define定义
1.#define定义的常量(会在预处理阶段查找替换定义的符号,替换后会把#define这条语句删掉)其不仅可以定义数也可以定义一条代码等。
例如:
注意:其是直接替换,要是表达式其不会计算完再替换,所以适当加上括号很重要。
例如:
2.#define定义的宏(可达到函数的效果,但与函数还是有区别的)
例如:
3.宏和函数的对比
4.#undef 用于清除#define定义的符号,清除后将无法使用该符号代表的内容。
5.注意:#define不会查找字符串中的量。当宏的参数中有#define定义的量时,会被优先替换。
三.条件编译指令
1.单分支选择指令 (#if 常量表达式 #endif)
例如:
2.多分支选择指令 (#if #elif #else #endif)
例如:
3.判断是否定义指令 (#ifdef #endif)
用法如下:
4.避免一个头文件被多次引用 (#ifndef #define #endif或#pragma once)这个在大型工程中为保证程序效率还是相当有必要写的。
例如:
四.本地头文件和库头文件的区别
1.包含本地头文件要用#include“”而包含库的头文件要用#include<>
2.查找策略不同:找本地头文件时会优先在.c文件的目录下查找,找不到会像找库的头文件一样在标准位置查找,再找不到就会报编译错误。而找库的头文件时,会直接在标准位置查找,找不到就报编译错误。
思考:库的头文件可不可以用#include""来包含,为什么?有无缺点?
OK,今天就说到这里吧,有什么不足请大家及时指出。思考的答案我会放到评论区。