【C语言】程序编译过程详解

我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。

  • 预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
  • 编译, 检查语法,生成汇编 ( test.s main .s)
  • 汇编, 汇编代码转换机器码 (test.o main.o)
  • 链接 链接到一起生成可执行程序 a.out

预处理

是一种展开,下表是常用的一些预处理命令
在这里插入图片描述
宏函数很好用,是直接展开,宏的好处和坏处点击此处

还有一些预处理阶段的展开

include

尖括号是预处理到系统规定的路径中去获得这个文件(即 C 编译系统所提供的并存放在指定的子目录下的头文件)。找到文件后,用文件内容替换该语句。如stdio.h

#error 预处理,#line 预处理,#pragma 预处理

  • #error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提示消息,并停止编译。

  • #line 的作用是改变当前行数和文件名称,如#line 28 liu

  • #pragma 是比较重要且困难的预处理指令。

#pragma once 这个的做用就是防止头文件多次包含

#pragma pack

使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
使用指令#pragma pack (),编译器将取消自定义字节对齐方式。
在#pragma pack (n)和#pragma pack ()之间的代码按 n 个字节对齐。

字节对齐浅显易懂点击此处!

#pragma pack(push) //保存当前对其方式到 packing stack
#pragma pack(push,n) 等效于
#pragma pack(push)
#pragma pack(n) //n=1,2,4,8,16 保存当前对齐方式,设置按 n 字节对齐
#pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐

编译

编译阶段是检查语法,生成汇编,这个属于程序员的必备知识,我们学习一门语言第一步就是知晓语法,其中比较生涩的有左值右值,指针的使用,内存的管理,数据结构的使用。

扫描二维码关注公众号,回复: 13137149 查看本文章

在这里我截取优先级问题,这个可能会通过编译但是不一定达到程序员想要的结果。
在这里插入图片描述

汇编

汇编代码转换机器码 这个阶段,非底层的程序员不需要考虑, 编译器不会搞错的。也与c/c++开发者无关,但是我们可以利用反汇编来调试代码,学习汇编语言依然是必备的

链接

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,文件生效时才会调用。

很多代码编译通过,链接失败就极有可能在静态库和动态库这出现了纰漏,要视情况解决。缺少相关所需文件,就会链接报错。这个时候就要检查下本地的链接库是不是缺损。

转载:https://blog.csdn.net/weixin_41143631/article/details/81221777

猜你喜欢

转载自blog.csdn.net/Vcrossover/article/details/112604148