美文网首页
C/C++编译模型

C/C++编译模型

作者: zhiwang1757 | 来源:发表于2018-12-27 17:56 被阅读0次

    C/C++是以源文件为单位进行编译的,每个源文件依次要经过预编译,编译,汇编,链接最终生成可执行文件或者库文件。

    预编译器:对头文件、宏以及条件编译的展开,可通过命令$gcc -E main.c -o main.i实现预处理。

    编译:对预处理生成的中间文件进行词法分析、语法分析、语义分析,最终生成汇编代码,可通过命令$gcc -S main.i -o main.s

    汇编器:将汇编符号对应的转换成二进制码的过程,可使用命令$gcc -c main.s -o main.o

    连接器:将所有的目标文件以及相关的库文件打包生成可执行,库文件的过程。

    了解上述过程对开发过程的遇到编译和链接错误的解决会有很大帮助,有时候项目很庞大,但是其实编译和链接的错误可能仅仅发生在单个或者少个文件上,这时将单个文件隔离出来分别进行上述的单步操作会给问题解决带来很大的帮助(当然对于GCC/G++增加-I/-L选项是必须的)。

    计算机科学是一门解决问题的学科,同时也是一门编解码或者符号的科学。程序中的数据或者函数其实都对应个符号,这个符号既有空间的属性,因为占用存储空间,同时又有时间的属性,因为每个符号都有作用域。

    头文件的几个思考

    Q:是否一定需要头文件?A:如果把所有的代码放在同一个文件中,一个小的项目几千行代码勉强可以接受。对于一个几万行,几十万行的还行得通吗?试想你在维护这样一个代码,那你每天肯定都在滚动鼠标中度过,无论阅读还是修改代码都会有很大的挑战。其次,对于大型的项目都会采用编译配置工具进行编译管理,如makefile、ninja等,大多实现了增量编译,可以极大的缩短开发过程中的编译时间,如果采用单个源文件进行管理那么无疑会浪费大量的编译时间,肯定是不能接受的。最后,为了实现代码的复用,头文件+源文件的方式可以得到接口与实现的分离。

    Q:是否可以包含.c/.cpp文件呢?A:对于预处理器其实是不对文件的后缀进行区分的,所以包含.c/.cpp应该是可行的,但是对于这种非常规的用法,程序员应该清楚自己在做什么。

    Q:对头文件的保护是必须的吗?A:大多数情况是必须的,因为没办法保证这个头文件会被如何使用。如果在同一源文件中被包含了两次,由于文件的拷贝引起的时间开销倒是小事,引起的各种类型的重定义是非常不必要的。

    Q:关于头文件中的前向声明与#include如何选择?A:无疑前向声明是首选,但是有些时候声明会非常复杂,比如容器的迭代器,有些时候前向声明并不足够,一般出现以下两种情况,子类的头文件中必须包含父类的头文件,在当前类的实现中有某一个类的成员变量。

    相关文章

      网友评论

          本文标题:C/C++编译模型

          本文链接:https://www.haomeiwen.com/subject/inyrlqtx.html