C++深入理解(1)------计算机编译过程

    这是第二遍读C++ Primer Plus这本书,对C++的认识有了进一步的了解,关于计算机对代码的编译过程有了进一步的了解,这里写出来作为自己的笔记。

    代码的编译过程大致分为以下几个步骤:预处理-编译-链接-生成。

    说下对这句话总得理解:在编写代码时,总会有.h和.c文件,实际上编译的过程是将.c文件转化为目标文件(计算机可以识别的文件,一般都以.o文件作为后缀),进一步在将所有的目标文件进行链接形成一个可执行文件。

    预处理的过程在浅层上的理解就是执行#等文件,而从实际原理上来说,是将每一个.c文件的代码的#部分找出来,然后进行预处理的过程:这个过程是将#后边的内容解析出来,如文件包含#include <iostream> 就是将iostream文件的内容放在.c文件的开头,经过所有的替换之后,就相当于东风也具备了,就可以真正的解析.c文件了。

    在构建代码的时候,要考虑到每一个.c文件都是一个相对独立的个体,用到外部的东西,都应该用#预处理语句包含进来。这里会涉及到自己写.h文件的几个注意事项:

    (1).自己写.h文件一定要防止重复包含。可以使用#ifndef #define 或者使用#pragma once等。

    (2).尽量不要在.h文件中包含其他文件,而是在对应.c文件中包含需要的文件,这样可以减少程序的复杂度,更好理解

    (3)..h文件一定不可以用来定义变量,只可以声明,否则就会编译错误

    (4)..h文件中尽量不要使用过于复杂的类或者模板作为参数,如string,就会产生warning,虽然可以关闭warning,但是强迫症表示函数有些不舒服。

    然后就可以将文件转换为目标文件,接下来的步骤是链接的过程,就是将所有的.o目标文件转化为一个可执行文件,但是这个过程如果遇到重复定义等的问题就会报错,或者无法找到对应的依赖库。所以在涉及的过程中就要注意变量的定义,防止出现错误。

    在进行链接之前,编译器需要对函数进行适当的处理,这样链接程序才能认识函数,实现真正的链接程序的效果,那么在底层编译器是如何处理这些函数,使其可以成为被链接程序认识的语言呢?

    在C++中,一般讲函数转成_函数名_参数类型名_参数类型名,如int add(int a,double b),会被转化为_add_i_d,这种转化被称为C++的语言链接性。但是在C语言中并不是这样操作的,会被转化为_add形式,所以两种是完全不同的编译形式,但是时长会出现这样的情况,例如在C++的程序中必须使用C函数库,如lua的函数库,所以必须使用C的编译形式,系统才能正常找到函数,进行正常的链接工作。

    一般使用如下方式声明编译的方式:

extern "C" void add();    //根据C语言的规则
void add();               //根据C++的规则
extern "C++" void add();  //根据C++的规则



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章