C++代码编译过程

news/2024/9/19 22:06:57/文章来源:https://www.cnblogs.com/Isakura-red/p/18421461

代码转换成可执行文件的全过程

看了一些网上的文章,觉的还是自己写写看看才能理解通透,也为找简历做准备。

代码转换成可执行文件分为4个步骤,预处理、编译、汇编、链接。

预处理

这个过程是执行代码中的一些预处理指令,多说无益,直接上代码

#include <iostream>
#define Best true;
#ifdef DEBUG
using namespace std;
#endif // DEBUGint main()
{Best;printf("Hello World!\r\n");return 0;
}

这是一个C++源码,等它预处理完成后会怎么样?

vs2019可以在项目属性-预处理器-预处理到文件夹-是,在项目的Debug文件夹中会有生成的.i文件。

#line 1 "D:\\CppRes\\Yidaoyun\\C++学习疑难\\VirtualFunction.cpp"
#pragma external_header(push)
#line 1 "D:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\iostream"#pragma once#pragma external_header(push)
#line 1 "D:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\include\\yvals_core.h"#pragma once
...

为什么用省略号,因为生成后的.i文件实在太长了,足足有64211行,拿出去也可以吹写了6w+行代码了hh(其实一半都是空行)。

可能有人会好奇,为什么预处理完成之后还有#pragma之类的预处理命令,我在该文件中find了一下,发现#include、#define、#ifdef之类的命令都不存在,所以可以得出,这三种命令应当是执行完了。

include命令是将其他文件中的源码复制过来,这点应该很好理解;#define命令是将宏替换成定义,在我的代码中就体现为把所有Best替换为true;#ifdef则是判断条件,如果条件符合就将中间的代码加入到.i文件中,避免编译不需要的代码造成可执行文件冗余。

那么其他带#的命令是干嘛的呢?就不赘述了,唯一有一点比较好奇的是为什么预处理完成之后还有#pragma命令?

我有一种推测,.i文件里#line命令用于控制预定义宏,而#pragma跟代码一样作为指令控制系统和主机,两者都作为CPU的执行代码存在于.i文件中,不可被省略。

编译

这时需要对.i文件进行词法分析、语法分析、语义分析,我好像记得在搜索引擎里学过类似的概念这个讲起来比较复杂,回头留个专栏讲这个。

//TODO:编译原理

汇编

将源码转换为机器码,不过编译器会对机器码进行优化,生成.o文件即二进制可重定向文件。

链接

链接过程可分为静态链接和动态链接。静态链接即将不同.o文件的相似字段进行合并,生成可执行文件。动态链接即程序启动才将dll文件加入到exe文件中执行。

//TODO:研究静态链接和动态链接

参考文献

C/C++:编译全过程——预处理、编译、汇编、链接(包含预处理指令:宏定义,文件包括、条件编译)_怎么在devc++里面把c文件变成汇编语言-CSDN博客

C/C++ 预处理器参考 | Microsoft Learn

程序的静态链接,动态链接和装载 - Szz - 博客园 (cnblogs.com)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !

编写技术文章是程序员分享经验和记录学习成果的重要方式。 为了让写作变得更轻松,有许多实用工具可以帮助提升效率,比如 Markdown 编辑器、画图工具等。 接下来,笔者将介绍四款简单实用的工具,帮助程序员更轻松地编写技术文章。1 Typora :Markdown 编辑器 Typora 是一款简…

【专题】2024年9月游戏行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37732 在当今数字化高速发展的时代,游戏行业已然成为了文化与科技融合的前沿阵地。中国游戏行业凭借着不断创新的技术、丰富多元的内容以及日益拓展的市场,正以蓬勃之姿在全球舞台上绽放光彩。阅读原文,获取专题报告合集全文,解锁文末153份…

山东旅游攻略

目录山东概览地形图威海刘公岛 山东概览 地形图威海 刘公岛 最主要看中日甲午战争的遗址 参考视频 https://www.youtube.com/watch?v=55vH8J2s3Ow

基础靶机(CentOS7)自测练习WP

1信息收集 192.168.5.141:8090 open 192.168.5.141:8009 open 192.168.5.141:22 open 192.168.5.141:3306 open 192.168.5.141:6379 open 192.168.5.141:8080 open 192.168.5.141:8899 open 192.168.5.141:9080 open [*] alive ports len is: 8 start vulscan [*] WebTitle htt…

【TSTYFST】我回来了

【置顶】最后的直播,大家能来看 十分感谢…! 大家愿意看到最后的,真的最后十分开心!能和猫雷相遇 愿意喜欢上猫雷 真的十分感谢!十分幸福!那么,再见。我要出发了……!如题。玩傻逼二游玩的。 万一这篇被看见的多了就藏了。以下为博客签名,与博文无关。只要你们不停下来…

nas远程联网访问部署方案

1.注册gemini 注册地址 (注册处有咸鱼验证(点击可知是系统负责人),提供提供你的注册名给Gemini,避免被定时删除账号) 2.开启NAS的SSH功能 以群晖举例,见一下三图,记得应用保存. 3.shell本地连入NAS 可以使用xshell,MobaXterm等进行连入,如果没有shell客户端,可以使用以下客户端…

Windows 调试工具课程

Windows 调试工具课程——在软件万种死法中调试出原因本文是我在集团内部上的课程记录而成的博客内容。在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路。适合于伙伴们入门 Windows 调试 本文以下内容是采用原本课程课件里面的一页页的内容…

Ubuntu 18.04.6 TLS版本安装docker问题

技术问题求助: 版本号: Ubuntu 18.04.6 TLS Docker version 24.0.2, build cb74dfc 使用以上版本的ubuntu安装完成docker,安装完成之后使用docker下载镜像,报以下错误:尝试1:修改镜像源: 新建文件:vim /etc/docker/daemon.json root@ubuntu:~# cat /etc/docker/daemon…

github搭建图床配合typora

github搭建图床配合typora 目录github搭建图床配合typoragithub搭建图床利用PicGo上传图片typora配合实现自动上传 好久没有学习了。。。看到博客园发的求救博客,五味杂陈,除了充个会员,就是写写博客活跃一下,支持一下园子 重拾坚果云,发现之前笔记里很多图片用的公共图床…

数字自然资源领域的实现路径

在数字化浪潮的推动下,自然资源的管理与利用正经历着前所未有的变革。本文将从测绘地理信息与遥感专业的角度,深度分析数字自然资源领域的实现路径。 1. 基础数据的数字化数字自然资源的构建,首先需要实现基础数据的数字化。这包括地形地貌、土地利用、植被覆盖、水资源等自…

易优eyoucms提示“异常登录,不在特定范围内”安全锁导致的

data/conf/uneyousafe.txt 丢一个这个文件,里面空也没事(安全锁就立马失效了) uneyousafe.txt 放在 data/conf/ 目录里扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网…

为什么寄存器需要建立时间和保持时间约束?——从门级角度理解

目录 1.建立时间与保持时间 2.从寄存器的内部结构理解建立时间与保持时间 2.1寄存器的结构 2.2主从锁存器构成的寄存器 2.3传输门构成的寄存器 3.查看寄存器的建立时间和保持时间 文章内容为博主学习记录,如有错误,欢迎在评论区指正。 1.建立时间与保持时间 寄存器的建立时…