C++编译和链接

目录

一、源代码的组织

①头文件(*.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一样。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值