C语言 程序的预编译、编译、链接

程序运行过程


文件后缀名规则
C程序:.c
C++程序:
非UNIX系统——.cpp;UNIX系统——.cc


1.预处理

预处理的命令以“#”开头。

“#include”和“#define”都属于编译预处理,C语言允许在程序中用预处理指令写一些命令行。
预处理器在编译器之前根据指令更改程序文本。

编译器看到的是预处理器修改过的代码文本,C语言的编译预处理功能主要包括宏定义、文件包含和条件编译3种预处理器对宏进行替换,并将所包含的头文件整体插入源文件中,为后面要进行的编译做好准备

#include <文件名>或者#include “文件名”

两种形式的区别在于:使用尖括号表示在系统头文件目录中查找(由用户在设置编程环境时设置),而不在源文件目录中查找。使用双引号则表示首先在当前的源文件目录中查找,找不到再到系统头文件目录中查找。


#include <.h> 与 #include <>的区别:
C++是在C语言基础上发展的一门编程语言,而C++ 99%的兼容C,也就是说,一般你写的一个C程序,也属于一个C++程序。C++为了兼容C,继承了原来C语言中的库。如, 你可以直接在C++程序中使用。但是呢,C++也对原来的C库做了一些自己的规范,也就是说使用了双重标准,你可以使用原来的C库,但C++推荐使用C++规范下的C库。

1、由于引入了名称空间这个东西。标准库都在std这个名称空间中。也就是说从C中继承的库都放在了std名称空间中。你不能直接使用额,需要加名称空间限定。
2、 并且规定:标准库的头文件不再使用.h后缀,而采用无后缀。如果某个库是从C中继承过来的,则去掉后缀.h,并在前面加上c 比如 改为。如果是C++特有的库,则不添加c。

如"vector>" “string”
如果你使用的是老式的,C标准下的库,比如#include,则可以直接使用math库中的函数。因为老式的C库不存在名称空间这个技术。
如果你使用的是C++标准下的C库,比如 #include “cmath”。需要加名称空间限定 std::sqrt() 。当然如果你使用了using namespace std;则可以直接使用sqrt,而无需加 std::限定


5个预定义宏(可以直接使用)
C语言 程序的预编译、编译、链接_第1张图片


2.编译

编译器处理的对象是由单个c文件和其中递归包含的头文件组成的编译单元,一般来说,头文件是不直接参加编译的。

编译器会将每个编译单元翻译成同名的二进制代码文件,在DOS和Windows环境下,二进制代码文件的后缀名为.obj,在Unix环境下,其后缀名为.o,此时,二进制代码文件是零散的,还不是可执行二进制文件。

错误检查大多是在编译阶段进行的,编译器主要进行语法分析,词法分析,产生目标代码并进行代码优化等处理。为全局变量和静态变量等分配内存,并检查函数是否已定义,如没有定义,是否有函数声明。函数声明通知编译器:该函数在本文件晚些时候定义,或者是在其他文件中定义。


3.链接

链接器将编译得到的零散的二进制代码文件组合成二进制可执行文件,主要完成下述两个工作,一是解析其他文件中函数引用或其他引用,二是解析库函数。

你可能感兴趣的:(C语言)