首页 > 编程语言 >C++编译器的那些事

C++编译器的那些事

时间:2024-09-15 11:24:17浏览次数:11  
标签:文件 obj 代码 C++ 那些 编译器 我们

接上文

OK! Right now!   Let's  go!

C++编译器是如何工作的?C++编译器实际负责什么?

我们把C++代码写成文本。就是这样,他只是一个文本文件,然后我们需要一些将文本转换为实际应用程序的方法,我们的计算机可以运行。从文本形式到实际可执行的二进制文件,我们基本上有两个主要的操作需要进行,其中一个叫做编译,另外一个被称为链接。

首先,我们先讨论编译,编译器实际上需要做的唯一一件事,将我们的文本文件拿来,转换成一种称为目标文件(.obj)的中间格式。然后这些obj文件传递到链接。

编译器在生成这些obj时实际上做了几件事。首先,他需要预处理我们的代码。这意味着所有的预处理语句都会先被处理。

一旦我们的代码被预处理,接下来我们将或多或少地进行记号化和解析,基本上把这个英语C++语言整理成编译器能够真正理解和推理的格式。这就导致了所谓的抽象语法树被创建,就是我们代码的一种表示,但是是抽象的语法树。

编译器每天的工作是:转换我们所有的代码,转换成常量数据或指令。一旦编译器创建了这个抽象语法树,他可以开始实际生成代码,这段代码就是实际的机器(我们的CPU)将执行的代码,我们还得到了其他各种数据,比如一个储存所有常量、变量的地方。

接下来我们详细看一下预处理

结果表示Math文件编译成功了。这是因为所有编译器做的是打开头文件,复制所有内容,粘贴。

让我们添加更多的预处理器语句,看看发生什么。

define预处理器语句基本上只进行搜索INTEGER,并将其替换为后面的内容(int)

我们可以看到这个 .i 结尾的文件,这个就是我们预处理后的C++代码,在记事本中打开这个文件:

这里我们可以看到预处理器实际上生成了什么

include预处理器语句

在以上的例子中,编译器把我们的EndBrace.h文件插在这里。

IF预处理器语句可以让我们包含或排除基于给定条件的代码,这里写if 1

如果我改成0,Visual Studio将会淡出下面的函数,显示它是被禁用的代码

再来看一下include <iostream>

很明显iostream文件中包含了大量的代码

一旦我们预处理这个阶段结束,我们可以继续实际编译C++代码

(记住要把预处理器中的预处理到文件选项关掉,否则不能生成.obj文件)

让我们来看看obj文件里是什么吧,我们用文本编辑器打开,会看到全是二进制。

但这里实际是当我们调用这个乘法函数时,我们的CPU将运行的机器代码。

因为全是二进制,我们把它转成看得懂的

这基本上是一个可读的文件,往下我们可以看到调用Multiply函数,然后我们有一堆汇编指令,这些是CPU将要执行的实际指令。

编译器的工作原理:它将获取源文件并输出一个obj文件,obj文件是包含机器代码的文件以及其他我们定义的常数数据。基本上是这样,现在我们有了这些obj文件,我么可以将它们链接成一个包含所有内容的可执行文件中,可执行文件是包含了需要运行的机器代码。

标签:文件,obj,代码,C++,那些,编译器,我们
From: https://blog.csdn.net/2401_87088772/article/details/142266837

相关文章

  • 哈?Dev C++ 支持代码智能补全啦?
    众所周不知,我是一名VS的用户,其实也用过其他的很多的C++编译器。印象最深的,还是DevC++。因为它是以一个个的.cpp文件为单位,可以直接编译运行,非常舒畅,不像VS那样,是以一个个项目为单位。而直到有一次,我原先安装的DevC++被我搞坏了,于是在本地存的一个安装包中随便找了一个......
  • 链表的快速排序(C/C++实现)
    一、前言大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍......
  • 南沙C++信奥老师解一本通题: 1361:产生数(Produce)
    ​ [题目描述】给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则:①1个数字可以变换成另1个数字;②规则中,右边的数字不能为零。例如:n=234,k=2规则为2→53→6上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。求经过任意次的变换(0次......
  • C++ 派生类赋值运算符应显示调用
    structBase{doublex{111.1};};structDerive:publicBase{doubley{222.2};Derive&operator=(constDerive&obj){if(&obj==this){return*this;}Base::operator=(obj);/......
  • VSCode 配置 C/C++ 开发环境的终极指南
    在现代软件开发中,VisualStudioCode(VSCode)因其轻量级、可扩展性和强大的功能而受到广泛欢迎。对于C/C++开发者来说,配置一个高效的开发环境是至关重要的。本文将详细介绍如何在VSCode中配置C/C++开发环境,帮助你快速上手并提高开发效率。一、安装VSCode首先,你需要在你......
  • c++中的继承和多态
    目录 Linux中的管道通信​编辑派生类的默认成员函数继承  派生类的构造 隐藏如何设计一个不能被继承的类菱形继承virtualvirtual是如何解决的内存对象模型继承和组合继承组合多态概念多态的构成条件虚函数的重写Linux中的管道通信派生类的默认成员函......
  • C++:初始化列表、友元、static
    目录一、初始化列表​二、static成员三、友元函数一、初始化列表•之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方 式,就是初始化列表,初始化列表的使用方式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后......
  • 「数学::质数」埃氏筛|欧拉筛(埃拉托斯特尼筛法|线性筛法)/ LeetCode 204(C++)
    目录概述1.埃氏筛思路复杂度Code2.欧拉筛(线性筛)思路复杂度Code总结概述上一节我们介绍了对判断一个数是否为质数的方法:「数学::质数」试除法/LuoguP5736(C++)那如果我们期望输出一个范围内的所有质数,使用试除法的时间复杂度是n√n,怎么办呢?LeetCode204:给定整......
  • 【C++基础概念理解——类的继承和嵌套】
    基本概念在C++中,类的继承和嵌套类的定义是两种不同的概念。classInitialSetupProcedure:publicStateMachine//类的继承(符号是":")classInitialSetupProcedure::StateMachine//类的嵌套(符号是"::",意思是类StateMachine嵌套在InitialSetupProcedure类中)......
  • stm32驱动HX711称重传感器 c++代码分享
    一、HX711模块介绍HX711模块是一种专门用于称重传感器的放大器模块。它的主要功能是将测得的微小电压信号放大到可以被微控制器读取的范围。HX711模块通常配合称重传感器一起使用,例如压力传感器、负载细胞等。它采用24位的模数转换器(ADC)来精确测量传感器的电压变化。HX711模块具......