目录
一、源代码的组织
①头文件(*.h)
②源文件(*.cpp)
③主程序(main函数所在的程序)
④从源代码到可执行文件,编译的过程有三大步骤:
1)编译预处理
2)编译
3)链接
二、编译预处理
三、编译
四、链接
五、更多细节
一、源代码的组织
①头文件(*.h)
#include头文件、函数的声明、结构体的声明、类的声明、模板的声明、内联函数、#define和const定义的常量等。
②源文件(*.cpp)
函数的定义、类的定义、模板具体化的定义
③主程序(main函数所在的程序)
主程序负责实现框架和核心流程,把需要用到的头文件用#include包含进来。
④从源代码到可执行文件,编译的过程有三大步骤:
1)编译预处理
2)编译
3)链接
二、编译预处理
编译预处理是指对我们写的源代码进行预处理,生成临时文件
预处理的包括以下方面(了解即可)
①预处理#include头文件包含指令
②处理条件编译指令#iifdef #else #endif、#ifndef #else #endif
③处理#define宏定义
④为代码添加行号、文件名和函数名
⑤删除注释
⑥保留#pragma编译器指令(编译的时候会用到)
三、编译
编译主要是将预处理生成的临时文件经过词法分析、语法分析、语义分析以及优化和汇编后生成二进制的目标obj文件。只检查是否合法,不检查定义是否存在,所以如果名称存在但是定义不存在,在编译的时候不会报错,链接的时候才会报错。
四、链接
链接是指将编译后的目标obj文件,以及他们需要的库文件链接在一起,形成一个整体的可执行的exe文件。
五、更多细节
①分开编译的好处
每次只编译修改过的源文件,然后再链接,效率最高。
②编译单个*.cpp文件的时候,必须要让编译器知道名称的存在,否则会出现找不到标识符的错误。
③编译单个*。cpp文件的时候,编译器只需要知道名称的存在,不会把他们的定义一起编译。
④如果函数和类的定义不存在,编译不会报错,但链接会出现无法解析的外部命令。
⑤链接的时候,变量、函数和类的定义只能有一个,否则会出现重定义的错误。(如果把变量、函数和类的定义放在*.h文件中,*.h会被多次包含,链接前会存在多个副本,如果放在*.cpp文件中,*.cpp文件不会被包含,只会被编译一次,链接前只存在一个版本)
⑥把变量、函数和类的定义放在*.h中是不规范的做法,如果*.h会被多个*.cpp包含,会出现重定义。
⑦用#include包含*.cpp也是不规范的做法,原理同上。
⑧尽可能不适用全局变量,如果一定要用,要在*.h文件中声明(需要加extern关键字),在*.cpp中定义。
⑨全局的const常量在头文件中定义(const常量仅在单个文件内有效)。
⑩*.h文件重复包含的处理方法只对单个的*.cpp文件有效,不是整个项目。
11)函数模板和类模板的声明和定义可以分开书写,但它们的定义并不是真实的定义,只能放在*.h文件中;函数模板和类模板的具体化版本的代码时真实的定义,所以放在*.cpp文件中。
12.Linux下C++编译和链接的原理与VS一样。