进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)

简介: 进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)

绪论

       书接上回,在上章我们学习完了文件的操作这样就能方便我们去保存我们所写代码的数据(学生信息管理系统),而本章于上一章并没有直接的关联,本章将讲的是程序在运行时会经历那些步骤(编译、预处理,链接等详细的了解C语言程序运行的过程)

image.png

话不多说安全带系好,发车啦(建议电脑观看)。


思维导图:

image.png

要XMind思维导图的话可以私信哈


目录


1.程序的翻译环境和执行环境    

1.1翻译环境

1.1.1编译

       1.1.1.1预编译(预处理,并生成.i为后缀的文件)

       1.1.1.2编译(并生成.s为后缀的文件)

       1.1.1.3汇编    

1.1.2链接

1.2运行环境

2.预处理详解

2.1预定义符号

2.2#define

2.2.2#define定义标识符

2.2.2#define定义宏

2.2.3#define 替换的规则

2.3 #和##

2.3.1 #

2.3.2 ##

2.3.3 带有副作用的宏参数

2.3.4宏和函数的对比

2.3.5命名约定

2.4#undef

2.5命令行定义

2.6条件编译

2.7文件包含

2.7.1文件包含的方式

2.7.2文件的嵌套包含

1.程序的翻译环境和执行环境    

在标准C语言语法(ANSI C)下有着两种不同的环境:翻译环境和执行环境

1.1翻译环境

知识点:

在翻译环境下是将源代码(.c)转换成机械指令(二进制指令)(可执行程序(.exe)),源代码就是我们所写的一个个语句(在vs2019环境下vs2019(集成开发环境是有着多个环境的集合)就充当了这个编译环境)

细节:

1.1.1编译

将每个源文件(.c)通过编译产生目标文件(.obj),最后通过链接器把链接库和目标文件统一的装在一起生成可执行程序(.exe)

image.png

具体如下展示:

image.png

image.png

image.png

1.1.1.1预编译(预处理,并生成.i为后缀的文件)

将预处理指令相关的操作(文本的替换)都会在此时执行(如#define、#include、#pragma都属于预处理指令)

#include头文件的包含、#define定义符号的替换、注释的删除

1.1.1.2编译(并生成.s为后缀的文件)

把C语言代码翻译成汇编代码(进行语法、词法、语义分析、符号汇总:汇总一些全局变量和函数)

1.1.1.3汇编    

把汇编指令转换成二进制指令

形成符号表(对应着符号汇总的符号生成类似于表(有符号和对应的地址)),而这符号表最终也会传递到链接处起作用

1.1.2链接

合并段表(在.o目标文件中他们是分段的,所以在链接时就会把这些对应功能的段进行合并,elf类型的)

符号表的合并和重定位 (将不同源文件的符号表合并,每个源文件都会生成对应的符号表,最终合并成一个可执行程序,并且将外部声明的符号重定位),而此处的重定位假如没有对应成功的话那将报链接错误(所以说当报错链接错误时就表示这可能是你的函数名写错了导致他们没有定位到)

上述的都是大概的内容,具体的可以通过学习《程序员的自我修养》这本书来深入了解。

1.2运行环境

知识点:

运行环境其实就是程序执行过程具体如下:

程序载入到内存中

程序执行(从main函数开始)

开始执行代码,这个时候运行栈帧空间/static(静态区空间),存储函数的局部变量和返回的地址

结束,分正常结束,意外终止(出错了链接型,和编译型编译型(语法、词法、语义有错误))

相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
101 1
|
3月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
122 1
|
3月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
144 0
|
5月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
1月前
|
编译器 C语言
C语言:typedef 和 define 有什么区别
在C语言中,`typedef`和`#define`都是用来创建标识符以简化复杂数据类型或常量的使用,但它们之间存在本质的区别。`typedef`用于定义新的数据类型别名,它保留了数据类型的特性但不分配内存。而`#define`是预处理器指令,用于定义宏替换,既可用于定义常量,也可用于简单的文本替换,但在编译前进行,过度使用可能导致代码可读性下降。正确选择使用`typedef`或`#define`可以提高代码质量和可维护性。
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
1月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
19 0
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
93 10
|
2月前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。