C++编译和链接

news2024/11/26 22:18:47

目录

一、源代码的组织

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习笔记——《吴恩达Machine Learning》线性回归例程

文章目录 案例背景线性回归(Loss Regression)梯度下降法(批量梯度下降算法——batch gradient descent)计算成本函数和梯度下降使用线性回归拟合训练数据模型预测 梯度下降效果可视化完整版demo 案例背景 详情参照吴恩达机器学习…

Linux/Windows安装Maven

一、Linux部署Maven 注意:必须先安装jdk,maven与jdk(java -version)版本会有对应关系 版本对应(必看!):http://maven.apache.org/docs/history.html 官方tar包下载地址:h…

因为一个Bug,差点损失了100w

大家好,我是洋子 最近在做单接口的性能测试比较多,在压测过程发现了一个比较有意思的问题,拿出来和大家分享一下 背景是这样的,最近在搞线上的抽奖活动,压测的对象是一个抽奖接口,主要的逻辑见程序的流程…

Spring ioc容器

Spring ioc容器 导入 spring 容器包 使用 ioc 容器之前,需要先导入 Spring 的包 在 spring maven中下载 spring maven 网址:Maven Repository: spring (mvnrepository.com) 搜索 spring 找到 Spring Web MVC点击 spring-webmvc 进入 选择一个版本号点击&#x…

Ocean Optics USB2000光谱仪无法在Win10系统运行

1、问题描述 USB2000型光谱仪,由于生产年代过于久远,虽然能被Win10系统识别,但是驱动程序安装完成后依然报错, 提示:该设备无法启动。(代码 10) 请求USB BOS 描述符失败。 运行SpectraSuite软件…

ETLCloud社区版与Kettle对比分析

ETLCloud社区版本与Kettle社区版本都有什么优势和劣势? Pentaho Data Integration(PDI),也称为Kettle,是一款开源的数据集成工具,国内有很多企业都选择kettle作为数据清洗工具。以下是kettle的主要特点和优势: 广泛的…

python 绘制箱型图一些技巧

引言 本篇是之前有一个需求,需要用python来画箱型图,但要求很多,所以我也不断再版,今天突然想起来这个东西可以总结一下,正好马上得思考下一步做啥了,有足够的空闲时间,所以准备把一些基础概念…

【笔试强训day48】顺时针打印矩阵、左右最值最大差

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: 笔试强训专栏 笔试强训 目录 文章目录 一、选择题 1.1 10.1.0.1/17的广播地址是( ) 1.2 网络地址172.16.22.38/28 请写出此地址的子网ID以及广播地址,此地址所处子网…

[2019“好贷杯“风控能力挑战赛一等奖] 基于神经网络算法的A股市场多因子选股的研究

本论文为 “2019年中国高校风险管理与控制能力挑战赛” 实际参赛作品,获得一等奖。 本论文体现了较好的数学建模思想和写作,所以将论文和完整代码进行了开源,方便与大家交流。

NetSuite SuiteTax之中国影响

这篇是还账。3个月前林师傅给的一个题目,陆陆续续的学习,一直没有弄完,直到今朝。 SuiteTax是2018年GA的一个重大功能,是NetSuite面向国际市场的一个标志动作。它将过去以美国为中心的税务功能,转向为国际市场服务。只…

xhs-xs webmsxyw分析

近期又更新了,先是改了x-s生成,然后又加上了a1校验。 后面可能会全参校验,比如再加上gid、deviceId、profileData、x-s-common、smidV2之类。 估计以后不能写xhs了,大家且看且珍惜吧。之前相关的文章都被下架了 危!…

C语言扫雷小游戏

扫雷小游戏 一,扫雷游戏的理解和整体思路1. 扫雷游戏的玩法2.写扫雷小游戏的整体思路 二,函数功能的实现模块1.宏定义2.打印菜单3.初始化雷盘4.打印雷盘5.布置雷6.玩家排雷6.1 显示该坐标有几个雷的函数6.2雷盘展开函数的实现 三.最终扫雷游戏的的实现1.…

AI绘画Stable Diffusion安装、使用教程 整合包下载

安装Stable Diffusion webui 效果图: 1.准备工作 在下载 AI 绘画工具前,电脑上需要提前下载一些运行的环境 1.下载python、git 首先本地机器最好是英伟达的 N 卡,并且至少需要 4GB 显存才能在本地运行,当然,A 卡也是…

微服务开发系列——第一篇:项目搭建(保姆级教程)

总概 A、技术栈 开发语言:Java 1.8数据库:MySQL、Redis、MongoDB、Elasticsearch微服务框架:Spring Cloud Alibaba微服务网关:Spring Cloud Gateway服务注册和配置中心:Nacos分布式事务:Seata链路追踪框架…

【CH32】| 00——开发环境搭建 | 软件安装 | 资料及工具下载

系列文章目录 TODO 文章目录 1. 简介2. 下载软件3. 安装4. 资料及工具下载4.1 芯片数据手册/参考手册4.2 评估(开发)板原理图/demo4.3 烧录软件4.3.1 isp串口一键下载4.3.2 WCH-LINK Utility烧录 4.4 WCH LINK相关资料/驱动安装4.4.1 WCH LINK相关资料4.4.2 WCH LINK驱动安装 5…

摆摊卖网红气球怎么样?

本章主要介绍一下最近网红气球: 最近看到很多摆摊的抖音视频,都在说卖气球很好,成本低,收益高,所以调研了一下,网红气球分好几种: a,飘空气球; b.手持网红气球 c.青蛙 首先介绍飘空…

初始python

初始python 缘由 ​ 对于python,相比大家并不陌生,Python是一种高级的、解释性编程语言,它具有简洁的语法和强大的内置函数,适用于广泛的应用领域,例如运维,Web开发,数据科学,人工智能等。Pyt…

JVM基础学习---1、JVM总体机制、类加载机制

1、JVM总体机制 1.1 JVM概念 JVM:Java Virtual Machine,翻译过来是Java虚拟机。 JRE:Java Runtime Environment,翻译过来是Java运行时环境。 JDK:Java Development Ki JDK:Java Development Kits&#…

Mysql字符集

1、修改MySQL5.7字符集 我们在新建数据库时(Navicat)界面时会遇到这两个选项,字符集和排序规则 在MySQL 8.0版本之前,MySQL 5.7 默认的客户端和服务器都用了 latin1 ,而latin1是不包含中文的,所以保存中文…

MetersPhere 试用

1. 功能测试 1.1 用例管理 脑图管理 样式: 脑图用例导入 1.2 用例评审 1.2.1 发起用例评审 1.2.2 关联用例: 1.2.3 用例评审 2. 接口测试 2.1 接口定义 类似postman、foxapi等主流接口管理页面 2.2 用例配置: 需要在meterphere安装节点…