C/C++编译过程

在学习C++过程中,遇到了头文件为什么最好是包含.h类型,而不是cpp类型的问题。在寻找结果的过程过,发现是跟语言的编译过程有关,借此机会学习一下C/C++的编译过程

目的就是:将高级语言转换成二进制语言,供计算机执行;

过程

1.预处理

替换代码中的头文件,宏定义,去除代码注释

gcc -E text.cpp -o text.i   -E:预处理完成后终止编译进行

2.编译

此过程中会将预处理之后的代码,翻译特定的汇编代码,通常情况下,当编译器报错语法错误时,就是在这个过程中。

gcc -S text.cpp -o text.i   -S:编译完成后终止编译进行

3.汇编

显而易见,就是把上一步转换到的汇编代码,翻译成机器语言

gcc -c text.cpp -o text.o   -c:汇编完成后终止编译进行

4.链接

在C/C++中,一定少不了对头文件的引用,当编译器把自己的cpp编译以后,还会链接到cpp中的头文件所对应的,obj文件,如此以来,整个程序才被编译成了可执行文件。

附表:

文件扩展名 文件类型
.c C语言代码
.C、.cc、.cpp C++语言代码
.i 预处理后的C语言代码
.s、.S 汇编语言代码
.o 目标代码
.a 静态链接库(程序编译时使用)
.so 动态链接库(程序运行时使用

回到上面的问题:

Q:为什么最好是包含.h类型,而不是cpp类型的问题?

A:当我们的头文件是cpp文件时,有如下弊端:

  • 当代码文件进行修改后,整个项目都需要重新编译,而当头文件是.h的时候,尽管修改了源代码,但是编译的还是那些代码量,不会在对头文件进行重新编译,之后直接就将编译出来的obj文件,与头文件对应的lib文件进行结合即可。(当整个项目不是很大的时候,二者没有太大的区别,但是当项目大时,这种优势就会很明显了)
  • 当以.h为头文件时,我们就可以很容易的实现库的传播,又能保证代码的闭源。

include <.cpp> 对***.cpp文件重新编译,之后将二者连接 。**

#include<.h> 对.h对应的文件名实现连接。*

参考链接:

编译器的工作过程

C语言编译过程详解

C/C++程序编译过程详解

原文地址:https://www.cnblogs.com/ymyguang/p/12856403.html