首页 > 编程语言 >C++代码编译过程

C++代码编译过程

时间:2024-09-19 22:01:47浏览次数:9  
标签:文件 代码 C++ 链接 编译 pragma 预处理

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

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

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

预处理

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

#include <iostream>
#define Best true;
#ifdef DEBUG
using namespace std;
#endif // DEBUG

int 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)

标签:文件,代码,C++,链接,编译,pragma,预处理
From: https://www.cnblogs.com/Isakura-red/p/18421461

相关文章

  • 计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统 Java+SpringBoot+Vue 前后端分
    ......
  • Monorepo:一仓统天下,揭秘现代开发的高效代码管理模式
    一句话文学:说清楚2个问题:1.什么是monorepo.2.monorepo都有哪几种代码结构模式很久以前,在一个名叫代码王国的地方,程序员们都在自己的小屋里忙着写代码。他们各自拥有自己的工具箱(代码库),但每次要分享工具或者联合工作时,就得穿过迷宫般的文件夹,传递代码包裹,甚至为了保证......
  • 代码随想录算法 - 回溯算法2
    之前做题给的题解都太混乱了,我决定好好按照思路写题解。题目139.组合总和给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidate......
  • 蓝桥杯十五届软件赛C++B组题解
    最近蓝桥杯官网已经把十五届题目上架了,我会尽快的将题解发出来,没有发的过段时间再补。​​​​​​​数字接龙一个很鹅心的搜索题,一不注意就会写错,比赛的时候写不来,题目上架后也WA了两个样例才过。题目大意:也就是说从(1,1)开始 ,下一步路的数据总是要比当前数据大1,超过k就......
  • C++内存管理
    前言接下来我们继续学习C++的内存管理。1. C++/C中程序内存区域划分C++将内存区域划分为四个部分,分别是栈区,堆区,静态区,常量区。其中静态区又叫数据段,其中存储全局数据和动态数据。常量区又叫代码区,其中存储只读常量和可执行代码。栈里面存储函数参数,返回值,局部变量等。......
  • C++笔记21•C++11的新特性•
       相比于 C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而......
  • C++入门基础知识76(实例)——实例 1【输出 “Hello, World!“】
    成长路上不孤单......
  • 生信软件35 - AI代码编辑器Cursor
    1.Cursor-AI代码编辑器Cursor的核心功能是利用生成式AI,帮助程序员通过自然语言描述快速生成代码。让程序员未来需要关注的是“做什么”(What)而不是“怎么做”(How),即在使用AI生成代码的基础上,思考能为用户创造什么样的功能。cursor官网地址:https://www.cursor.com/点击【......
  • 代码随想录刷题day13 | LeetCode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之
    110.平衡二叉树力扣题目链接后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树1.三元运算符:(?:)condition?expression_if_true:expression_if_false;前面是条件,如果符合就等于冒号前的expression_if_true,反之则是后面的。2.如果要使用if(!node->left),要......
  • C++刷怪笼(6)模板初阶
    1.前言在学习C++模板之前,我们会被同种函数的不同数据类型的繁琐写法而折磨,今天我们进入对模板的学习,来进一步的感受C++为我们今后的编程学习和工作所带来的便利。2.模板2.1泛型编程我们应该如何去实现一个所有数据类型通用的函数?voidSwap(int&left,int&right){i......