C/C++ :程序环境和预处理(上)

简介: C/C++ :程序环境和预处理(上)

目录

程序的编译链接过程

1.编译过程中的预处理阶段

2.编译过程中的正式编译阶段

3.编译过程中的汇编阶段

4.链接过程

程序的编译链接过程
一个程序的源码文件要经过复杂的编译链接过程才能被转换为可执行的机器指令(二进制指令)

编译链接过程概述:

编译过程:组成一个程序的每个源码文件通过编译过程分别被转换成目标文件(linux下为.o文件)
(注意每个源文件的编译过程都是分别独立进行的)
链接过程:每个目标文件(.o文件)由链接器(linker)链接在一起,形成一个单一而完整的可执行程序(.exe文件)
编译链接过程图:

1.编译过程中的预处理阶段
源码中的 # 修饰的语句代表预处理指令;

编译过程的预处理阶段(预处理阶段进行的是一些文本操作)主要完成的事情:

include所指向的头文件中的所有内容会被"复制粘贴"到#include语句所在的源文件中

define定义的符号的替换

注释的删除
注意:该阶段不进行语法检查

一个源码文件的预处理完成后会生成一个对应的 .i 源码文件

在win10的gcc编译环境下用vscode对源码文件进行预处理,在终端中输入:

gcc -E ./文件名 -o 输出的文件名(任意取)
编译器执行指令后便得到被预处理的源文件对应形成的.i文件:

2.编译过程中的正式编译阶段
编译过程的正式编译阶段主要完成的事情:

对文件中的源码进行语法检查以及各种分析(语法有误则报出编译错误)
将 .i 文件中的源代码翻译成汇编代码,生成.s文件
进行符号汇总
符号汇总会将.i文件中所有函数,全局变量的名称经过修饰后全部汇总起来,为符号表的生成做准备。(符号表在链接过程中起到重要作用)

在win10的gcc编译环境下用vscode对.i文件进行正式编译,在终端中输入:

gcc -S ./test.i
生成.s文件(汇编代码)

3.编译过程中的汇编阶段
编译过程的汇编阶段主要完成的事情:

将存储汇编指令的.s文件汇编成 .o文件(二进制文件)
形成符号表
符号表中存储了.s文件中所有函数经修饰后的名称(以及对应函数体的地址),所有全局变量经修饰后的名称(以及定义它们的指令的地址);

注意如果当前源文件没有定义某个被调用的函数(或全局变量),那么在符号表中该函数(或全局变量)所对应的地址将为无效地址(等到链接阶段再完成寻址)
比如:

4.链接过程
链接过程主要完成的事情:

各.o文件的合并
各.o文件的符号表的合并
比如:

链接过程完成后如果符号表中的无效地址仍然无法得到确定,编译器就会报出链接错误
C++中修改了C语言符号表中对函数名的修饰规则,为函数重载提供了底层机制上的支持.

相关文章
|
3月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
44 0
|
23天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
103 21
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
272 3
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
45 2
|
3月前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
63 0
|
3月前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
35 0
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
34 4
|
9天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
31 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4