预处理和程序的编程(跑路人笔记1)

简介: 预处理和程序的编程(跑路人笔记)

前言

最近好像被限流了很烦=-=


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

翻译环境类比于我们的VS2019集成开发环境


如图:


image.png


image.png




我们的可执行程序在生成的过程中,先将源文件逐个单独(一定是逐个单独)交给编译器使其变成我们连接器可以使用的目标文件(在Windows系统的拓展名是.obj )如test.c—>test.obj,然后经过连接器统一处理变成可执行程序.


翻译环境如何工作


image.png


围绕着这个两个图展开


分两大步——编译和链接。


编译1

编译这一步通过编译器完成


编译又分


预编译(也叫预处理)


完成了头文件的包含


#define定义的符号和宏的替换


删除注释


一系列的文本操作


编译


语法分析


词法分析


语义分析


符号汇总


也就是将C语言代码转换成了汇编代码。


汇编


将汇编代码转换成二进制也就是机器语言


生成符号表


生成了.obj的文件(他的格式elf),我们可以通过readelf这个工具来观察这个文件.


预编译

当我们想在gcc编译器下得到预编译后的结果可以通过输入:gcc test.c -E这样我们就得到了预编译后的文件test.i


功能一:完成头文件的包含

原代码:


image.png


后得到的文件内容:


image.png


又分为了两个部分:


1.看不懂的部分


image.png



而这我们看不懂的部分其实是对#include<stdio.h>的操作.他讲stdio.h内的文件包含到了我们的函数内


注:我们的stdio.h文件并非仅仅只有这些只是但是并非我们需要重视的知识点.


2.几乎和我们代码相同的部分


image.png


这些就是我们的代码


功能二: #define定义的符号和宏的替换

原代码:


image.png


预编译后:



image.png

image.png



我们之前通过#define定义的均已被替换我们的#define也已经被处理不见.


功能三: 删除注释

直接将注释删除(偷个懒)


所以无论写多少注释都不会对程序运行产生影响


相关文章
|
存储 自然语言处理 Dart
C生万物 | 详解程序环境和预处理【展示程序编译+链接全过程】
详细介绍C语言中程序的预处理、编译、汇编、链接过程。向你展示在计算机内部一个完整的程序是如何诞生的
186 0
C生万物 | 详解程序环境和预处理【展示程序编译+链接全过程】
|
机器学习/深度学习 数据可视化 算法
2022数模国赛C题思路解析(可供训练用 源码可供参考)
2022数模国赛C题思路解析(可供训练用 源码可供参考)
608 2
2022数模国赛C题思路解析(可供训练用 源码可供参考)
|
程序员 编译器 C语言
程序员内功心法之程序环境和预处理(2)
程序员内功心法之程序环境和预处理(2)
171 0
程序员内功心法之程序环境和预处理(2)
|
存储 自然语言处理 编译器
程序员内功心法之程序环境和预处理(1)
程序员内功心法之程序环境和预处理(1)
146 0
程序员内功心法之程序环境和预处理(1)
|
存储 编译器 C++
类的入门<C++入门>(跑路人笔记)(3)
类的入门<C++入门>(跑路人笔记)
类的入门<C++入门>(跑路人笔记)(3)
|
存储 自然语言处理 程序员
预处理和程序的编程(跑路人笔记2)
预处理和程序的编程(跑路人笔记)
预处理和程序的编程(跑路人笔记2)
|
编译器 程序员 Linux
预处理和程序的编程(跑路人笔记3)
预处理和程序的编程(跑路人笔记)
预处理和程序的编程(跑路人笔记3)
|
编译器 C语言 Windows
文件操作(跑路人笔记1)
文件操作(跑路人笔记)
文件操作(跑路人笔记1)
|
编译器
类和对象(跑路人笔记)<完>(4)
类和对象(跑路人笔记)<完>
类和对象(跑路人笔记)<完>(4)
|
编译器 C++
类和对象(跑路人笔记)<完>(2)
类和对象(跑路人笔记)<完>
类和对象(跑路人笔记)<完>(2)