预处理(展开头文件/宏替换/去掉注释/条件编译,形成 *.i 文件)
预处理名称 | 意义 |
---|---|
#define | 宏定义 |
#undef | 移除一个宏定义 |
#include | 使编译程序将另一源文件嵌入到带有#include的源文件中 |
#ifdef 和 #ifndef | 分别代表 如果有定义 和 如果没有定义,是条件编译的另一种方法 |
#if | 如果后面的常量表达式是true,则编译 #if 和 #endif 之间的代码 |
#else | #else和 else中一样 |
#elif | 和else if 一样 |
#endif | 表示 #if 这一个块的结束 |
语言内置的预定义符号(都是两个下划线 _ _ ,没有空格 )
__ LINE __ 表示正在编译的文件的行号
__ FILE __ 表示进行编译的源文件
__ DATE __ 文件被编译的日期
__ TIME __ 文件被编译的时间
__ STDC __ 判断该文件是不是标准C程序
宏函数
优点
1、提高性能。用于调用函数和从函数返回的代码可能比宏函数用的时间更久
2、宏是类型无关的。在宏定义的时候不用指定参数类型
缺点
1、宏没办法调试
2、每次使用宏的时候,一份宏定义的代码直接插入到程序中,如果宏比较长,则会大幅度的增加程序的长度
3、因为宏与类型无关,所以不够严谨
4、因为运算符优先级的问题,导致程序比较容易出错
5、可读性比较差
这是《C和指针》里面对宏和函数做的总结
#include
#include <filename>
尖括号是预处理到系统规定的路径下去寻找获得这个文件
#include "filename"
引号是预处理我们自己编写的文件
编译
检查语法,生成汇编,产生*.s文件
汇编
把汇编代码转换成机器语言,生成 *.o文件
链接
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。
动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,文件生效时才会调用