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

news2024/12/28 2:58:08

记录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.coloradmin.cn/o/1887404.html

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

相关文章

AI的价值——不再那么“废”人,保险行业用AI人员流失减少20%

最近有个热点挺让人唏嘘的&#xff0c;某咖啡店员工对顾客泼咖啡粉&#xff0c;我们对于这个事件不予评价。但是对员工这种情绪崩溃&#xff0c;我们所接触的行业中也有不少例子&#xff0c;比如保险行业&#xff0c;相信大家经常会被打保险电话&#xff0c;这类电话很容易就被…

K8s 的最后一片拼图:dbPaaS

K8s 的发展使得私有云跟公共云之间的技术差不断的缩小&#xff0c;不管是在私有云还是公共云&#xff0c;大家今天都在基于 K8s 去开发 PaaS 系统。而 K8s 作为构建 PaaS 的基础&#xff0c;其全景图里还缺最后一块“拼图”——dbPaaS。作为一个云数据库行业干了十几年的资深从…

Swin Transformer:最佳论文,准确率和性能双佳的视觉Transformer | ICCV 2021

论文提出了经典的Vision Transormer模型Swin Transformer&#xff0c;能够构建层级特征提高任务准确率&#xff0c;而且其计算复杂度经过各种加速设计&#xff0c;能够与输入图片大小成线性关系。从实验结果来看&#xff0c;Swin Transormer在各视觉任务上都有很不错的准确率&a…

哈尔滨如何选择合适的等保测评机构?

选择合适的等保测评机构确实需要细致考虑&#xff0c;您提到的八个方面已经非常全面&#xff0c;涵盖了资质、专业能力、服务质量和合规性等多个关键点。为了进一步确保所选机构的可靠性&#xff0c;还可以考虑以下几点&#xff1a; 1.技术创新与工具&#xff1a;了解测评机构是…

UE5的安装与基本操作(一)

文章目录 前言安装UE5新建第一个游戏项目基本游览方式对目标进行变换各种变换对齐 快速定位目标 总结 前言 Unreal Engine 5 (UE5) 是一款由 Epic Games 开发的实时 3D 创作平台&#xff0c;用于制作游戏、电影、动画、建筑可视化和其他类型的交互式体验。UE5 提供了一系列强大…

解锁IDEA中Git/SVN Issue Navigation功能:80%程序员都不懂的秘密武器~

文章目录 前言什么是 Git Issue Navigation&#xff1f;配置 Git Issue Navigation1. 打开设置2. 导航到 Issue Navigation 设置3. 添加新的 Issue Navigation 规则具体示例配置 使用 Git Issue Navigation在提交信息中使用 Issue ID实际导航到连接 优点1. 快速定位问题2. 提高…

可重入锁思想,设计MQ迁移方案

如果你的MQ消息要从Kafka切换到RocketMQ且不停机&#xff0c;怎么做&#xff1f;在让这个MQ消息调用第三方发奖接口&#xff0c;但无幂等字段又怎么处理&#xff1f;今天小傅哥就给大家分享一个关于MQ消息在这样的场景中的处理手段。 这是一种比较特例的场景&#xff0c;需要保…

6月28日华为云数据库斯享会上海站,NineData技术总监薛晓乐受邀并带来主题分享

6月28日&#xff08;周五&#xff09;&#xff0c;华为云数据库斯享会即将在上海举办&#xff0c;将与的开发者朋友们一起进行数据库技术交流&#xff01;NineData 技术总监薛晓乐受邀参会&#xff0c;并将带来《企业级数据库 DevOps 最佳实践》的主题分享。 本次活动议程&…

ROS2 分布式 及 ssh远程控制 和 上传文件夹

问题1. 多台计算机连接同一wifi后 &#xff0c;运行ROS2的小乌龟案例&#xff0c;自己的计算机&#xff0c;无法控制其他电脑的小乌龟 按照正常的情况来说&#xff0c;ROS2是DDS的自发现通信机制&#xff0c;只要处在同一wifi网络中&#xff0c; A计算机执行启动小乌龟的命…

Qt 配置ASan

Qt 配置ASan 文章目录 Qt 配置ASan摘要关于ASan&#xff08;AddressSanitizer&#xff09;在Qt中配置 ASan1. 安装必要的工具2. 修改项目的 .pro 文件3. 重新构建项目4. 运行应用程序5. 分析错误报告示例注意事项 关键字&#xff1a; Qt、 ASan、 AddressSanitizer 、 GCC …

DICOM灰度图像、彩色图像的窗宽、窗位与像素的最大最小值的换算关系?

图像可以调整窗宽、窗位 dicom图像中灰度图像可以调整窗宽、窗位&#xff0c;RGB图像调整亮度或对比度&#xff1f;_灰度 图 调节窗宽-CSDN博客 窗宽、窗位与像素的最大最小值的换算关系? 换算公式 max-minWindowWidth; (maxmin)/2WindowCenter; 详细解释 窗宽&#xff0…

【bug报错已解决】ERROR: Could not find a version that satisfies the requirement

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析 二、解决方法2.1 方法一2.2 方法二 三、总结 引言 有没有遇到过那种让人…

吴晓波:企业出海的最佳时间窗口只有5-10年,中国企业如何把握出海机遇?

鼓励企业参与绿色“一带一路”建设&#xff0c;带动先进的环保技术、装备、产能走出去。 出海计划&#xff01;马来西亚水环境项目国际考察暨2024中马水务合作论坛

探囊取物之多形式登录页面(基于BootStrap4)

基于BootStrap4的登录页面&#xff0c;支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候&#xff1b;演练页面可点击查看源码 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/pr…

记录部署项目《庆自提》完整流程

项目选型&#xff1a;后端网页小程序 前言&#xff1a;在部署这个项目我采用的是宝塔去直接部署&#xff0c;没有使用docker去部署 部署后端部分可参考&#xff1a;记录部署项目到云服务器_项目部署到云服务器-CSDN博客 一、部署后端 &#xff08;1&#xff09;修改yml配置文件…

大模型技术:能否引领十年的行业变革与职业发展黄金期?......

身边做程序的朋友、前同事&#xff0c;包括亲人&#xff0c;很多都在今年失业了&#xff0c;每年都说难&#xff0c;而今年&#xff0c;无疑是进入21世纪后最难的一年。 套用一下大话西游里的台词&#xff1a;上班的时候&#xff0c;不知道工作的珍贵&#xff0c;待到失去后才…

【日常记录】【JS】动态执行JS脚本

文章目录 1、第一种方式&#xff1a;eval2、第二种方式&#xff1a;setTimeout3、第三种方式&#xff1a;创建script 标签插入body4、第四种方式&#xff1a;创建 Function5、对比6、 参考链接 1、第一种方式&#xff1a;eval 语法 eval(string)参数 string&#xff1a;一个…

Linux基础篇——学习Linux基本工具安装教程视频链接

本篇文章就是记录一下学习Linux需要用到的基本工具的视频教程链接&#xff0c;方便以后查看 VMware15.5安装 安装视频教程&#xff1a;VMware15.5安装教程 centos7.6安装&#xff08;这个视频教程真的很nice&#xff09; 视频教程&#xff1a;centos7.6 虚拟机克隆、快照、…

数字化转型过程中企业会遇到哪些挑战?该如何应对?

你是否与我一样&#xff0c;也曾有过类似的疑惑&#xff1a; 企业数字化转型过程中会遇到哪些挑战&#xff1f;其中苦难&#xff0c;我们又该如何应对&#xff1f;有什么可借鉴的方法&#xff1f; 有了这些疑问&#xff0c;你肯定想知道答案。 为了解决你的心头之患&#xf…

开放式耳机哪个品牌最好?2024高热度机型推荐,选购不迷茫

选购开放式耳机时&#xff0c;面对琳琅满目的品牌与型号是否感到不知道怎么选择&#xff1f;别担心&#xff0c;作为耳机爱好者与资深评测人&#xff0c;我精心整理了几款热门开放式耳机的全面对比。这次对比不仅涵盖如何挑选&#xff0c;有哪些不要菜类的额点&#xff0c;还推…