C++基础知识-编译相关

记录C++语言相关的基础知识

1 C++源码到可执行文件的四个阶段

预处理(.i)、编译(.s)、汇编(.obj)、链接。

1.1 预处理

预处理阶段,主要完成宏替换、文件展开、注释删除、条件编译展开、添加行号和文件名标识,输出.i/.ii预处理文件。

  • 宏替换,对于使用#define定义的值直接进行文本替换
  • 文件展开,对于#include h文件,直接对包含的文件进行展开
  • 删除注释信息。保留#pragma 编译器指令。
  • 根据条件编译参数进行条件编译的展开
  • 添加行号和文件名标识
    例如 g++ -E compiler_test.cc -o compiler.i -DUSER_DEBUG=ON , 可以指定只生成预处理后的文件。图中省略了#include<stdio.h>即对应的预处理后文件内容。
    预处理

1.2 编译

对预处理文件进行词法、语法、语义分析和优化,产生对应的汇编代码,是构建过程中最复杂的部分。编译参数中-O选项就是在这一步生效的。
编译

  • 词法分析, 将源代码通过扫描器分析出源代码中的每一部分分别对应的类型是什么(tokens),例如数字、括号、运算符、赋值等。
  • 语法分析,根据tokens进行语法分析,生成语法树(表达式组成的树,运算优先级会在此时确定, 源代码级别的优化也会在此时进行)。
  • 语义分析,编译阶段进行的是静态语义分析,也就是检查语法树的类型是否匹配、进行类型转换、表达式是否有意义,语法树在这个阶段会被标记上语义。
  • 中间语言生成, 在语法树上对代码直接进行优化比较困难, 源代码优化器往往是把整个语法树转化成中间代码(与运行环境无关)。中间代码的出现将整个编译过程分成了两部分,前端部分将源代码转化成机器无关的中间代码,后端部分将后端代码转化为目标机器代码。
  • 目标代码生成与优化,通过代码生成器将中间语言转化为汇编代码,代码优化器针对汇编代码进行优化。
    g++ -S compiler.i -o compiler.s

1.3 汇编

将汇编代码转化为机器可以执行的指令,生成目标文件(.o, .obj)。这个过程就是汇编器对汇编语言的翻译过程。
g++ -C compiler.s add.s -o compiler.o

1.4 链接

C++的每个源代码是独立编译的,会存在不同的目标文件相互引用的情况,这个时候目标文件中的符号(变量、函数等)还没有真实的地址(这个阶段的地址取的是0),经过链接将不同的目标文件进行组合。主要是进行地址和空间分配、地址绑定、重定位, 将目标文件转化为可执行文件。

2 模板为什么通常不是分开声明和实现

关键一点是模板的实例化是要在编译单元内看到了模板实例化定义,而编译单元是每个cpp文件,如此一来在模板的cpp文件中,由于没有使用到模板,所以在编译模板时根本不会实例化。在其他cc文件中引用时,在链接阶段就会报错。而在模板cc文件中实现模板定义

template <typename T> T Add(const T &left, const T &right) {
  return left + right;
}
template int Add(const int&, const int&);

通常是不合适的,首先是不知道用户到底会实例化什么类型,其次代码很繁琐,所以一般都是在h文件中声明和实现。

3 常用的编译工具

gcc/g++、 automake、cmake、bazel

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

python_zabbix

zabbix官网地址&#xff1a;19. API19. APIhttps://www.zabbix.com/documentation/4.2/zh/manual/api 每个版本可以有些差异&#xff0c;选择目前的版本在查看对于的api接口#token接口代码 import requests apiurl "http://zabbix地址/api_jsonrpc.php" data {&quo…

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客 本人详细解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息 v1.0补…

从零开始:如何设计一个现代化聊天系统

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/chat-system 在当今数字化时代,聊天系统已成为我们日常生活和工作中不可或缺的一部分。从个人交流到团队协作,从客户服务到社交网络,聊天应用…

内网渗透第四天!!!冲冲冲!!怎么绕过uac以及你会all劫持???不安全的服务路径以及服务权限,你会吗???

在第三天我们简单的说了一下绕过uac&#xff0c;但是我们使用的msf模块ask要对方管理员跟我们一起来进行操作&#xff0c;才可以进行提权的操作&#xff0c;这点就限制住了我们。我们今天来讲一下不用钓鱼的绕过的操作。 绕过uac&#xff1a; 使用uacme项目和msf联动来进行绕过…

AD9026芯片开发实录6-example code

官方发布的软件包中&#xff0c;带了一份example code&#xff0c;用于向客户展示API的调用方法以及基于官方的验证版ADRV902X最简单的bring up的流程。 该 example 位于软件包的路径下&#xff1a;“\Adi.Adrv9025.Api\src\c_src\app\example\”。 代码组成&#xff1a; initd…

.NET周刊【6月第5期 2024-06-30】

国内文章 呼吁改正《上海市卫生健康信息技术应用创新白皮书》 C# 被认定为A 组件 的 错误认知 https://www.cnblogs.com/shanyou/p/18264292 近日&#xff0c;《上海市卫生健康“信息技术应用创新”白皮书》发布&#xff0c;提到医疗信创核心应用适配方法及公立医院信息系统…

2024 年江西省研究生数学建模竞赛题目 A题交通信号灯管理---完整文章分享(仅供学习)

问题&#xff1a; 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。一般情况下&#xff0c;十字路口有东西向和南北向…

二刷 动态规划

什么是动态规划 Dynamic Programming DP 如果某一问题有很多重叠子问题&#xff0c;使用动态规划时最有效的 动态规划中每一个状态是由上一个状态推导出来的。 动规五部曲 1.确定dp数组以及下标的含义 2.确定递归公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数…

分班查询系统,老师们应该如何制作?

新学期的开始&#xff0c;作为教师&#xff0c;我们面临的一项关键任务就是组织分班。传统分班方法往往需要处理大量的数据&#xff0c;这个过程不仅耗时&#xff0c;而且容易出错。为了简化这一流程&#xff0c;提高效率&#xff0c;我们可以利用现代技术&#xff0c;创建一个…

VSCode打开其它IDE项目注释显示乱码的解决方法

问题描述&#xff1a;VSCode打开Visual Studio&#xff08;或其它IDE&#xff09;工程&#xff0c;注释乱码&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a;点击VSCode右下角的UTF-8&#xff0c;根据提示点击“通过编码重新打开”&#xff0c;再选择GB2312&#xff0…

【触想智能】工业平板电脑在新能源领域上的应用分析

工业平板电脑是一种具有高性能和稳定性的计算机设备&#xff0c;适用于在恶劣环境下进行数据采集、运营管理和现场操作。 随着新能源技术的快速发展&#xff0c;工业平板电脑不断地得到应用&#xff0c;并且已成为新能源领域中的重要工具之一。本文将从四个方面探讨工业平板电脑…

VMware Mac/Win 虚拟机软件介绍

VMware作为全球领先的虚拟化技术提供商&#xff0c;其Mac/Win虚拟机软件为用户带来了前所未有的跨平台操作体验。这款软件凭借其强大的功能和稳定的性能&#xff0c;成为了众多开发者、设计师、企业用户以及个人用户的首选工具。 强大的多操作系统支持 VMware Mac/Win 虚拟机…

c++习题06-ljc的储蓄计划

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 2&#xff0c;思路2 三&#xff0c;代码 1&#xff0c;思路1代码 2&#xff0c;思路2代码 四&#xff0c;用例输入输出 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 定义变量&#x…

频繁调价不用愁,统一销售报价话术就用聊天宝

前言 在当今的数字化时代&#xff0c;企业面临着日益增长的客户服务需求&#xff0c;特别是在电商、销售等领域。客服团队的效率和响应速度直接影响到客户满意度和企业的专业形象。面对频繁变动的价格信息和销售策略&#xff0c;如何确保客服回复的及时性和准确性成为了一大挑…

uboot 编译时传递参数实现条件编译

KCFLAGS make ARCHarm KCFLAGS-DENV_DEBUG CROSS_COMPILEaarch64-linux-gnu-env/sf.c env_sf_save 加入调试信息 # saveenv Saving Environment to SPI Flash... env_sf_save (1) spi_flash_erase (2) spi_flash_write is40000 Erasing SPI flash...Writing to SPI flash.…

Git入门 本地仓库 远端仓库 多分支

Git入门 Git入门本地git初始化git仓库初始化 创建远端仓库githubgitee 指定远端仓库推送至远端多分支将feature分支合并至dev分支 其他开发者 Git入门 本地git初始化 git仓库初始化 mkdir myrepo # 创建仓库文件夹 cd myrepo/ # 进入目录 git init # 初始化git仓库 (创建.g…

YOLOv8改进 | 卷积模块 | 减少冗余计算和内存访问的PConv【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

某Dota/IM对战平台玩家助手、查看战绩下、胜率等

功能说明 WAR3游戏启动后&#xff0c;可以自动获取游戏双方的玩家列表&#xff0c;然后查询显示玩家的战绩及个人信息。附带查看玩家的战绩详情、最近游戏&#xff0c;查看对手及友方的战绩详情&#xff0c;据此推算出是否开黑、是否小号等信息 使用方法及运行效果 启动 查…

品牌推广怎么样?掌握正确做法,让品牌大放异彩!

品牌推广对于初创公司来说是一项至关重要的任务。在市场众多品牌中&#xff0c;如何脱颖而出&#xff0c;是每个品牌方都要考虑的问题。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国复制了100多家门店&#xff0c;我来分享下&#xff0c;如何推广&#xff0c;可以让品牌…