编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

一文搞懂预处理器与链接器(预处理器和编译器)

gowuye 2024-04-25 04:45 5 浏览 0 评论

(图片来自Objected-Oriented Programming Using C++: An Elaborative Appraoch(https://icarus.cs.weber.edu/~dab/cs1410/textbook/1.Basics/compiler_op.html))

什么是预处理器和链接器?

预处理器(preprocessor )和链接器(linker)是编程中编译和链接代码过程中的两个不同组件。让我们深入了解每个组件。

预处理器

预处理器是编译的初始阶段。它的主要目的是处理不属于核心编程语言指令,但提供额外功能的指令。它在实际编译开始之前对源代码进行操作。

常见的预处理器指令包括宏定义(#define)、文件包含(#include)、条件编译(#ifdef、#ifndef、#if、#else、#endif)以及其他类似的指令。

预处理器的角色是在源代码经历编译之前对其进行操作。

链接器

链接器是编译之后的独立阶段。它接收编译器生成的已编译目标代码,并将其与其他必要的代码和库结合起来,生成最终的可执行程序。

链接器解析程序不同部分之间的引用,例如函数调用和变量引用。它将各种对象文件和库链接在一起,确保所有部分协调一致地组合在一起。

链接器负责解决未解析的符号问题并生成最终的可执行文件。

预处理器和链接器有什么区别?

执行时间

预处理器在实际编译之前运行,对源代码进行操作。

链接器在编译之后运行,将已编译的目标代码组合起来生成最终的可执行文件。

功能

预处理器处理与源代码本身相关的指令和操作,例如文本替换和文件包含。

链接器处理已编译代码的组合,解析程序不同部分之间的引用,并生成最终的可执行文件。

总之,预处理器在编译之前的源代码上进行操作,而链接器在编译阶段之后对已编译的目标代码进行操作。它们在将源代码转换为可执行程序的过程中扮演着不同的角色。

预处理器如何操作源代码?


(图片来自Objected-Oriented Programming Using C++: An Elaborative Appraoch(https://icarus.cs.weber.edu/~dab/cs1410/textbook/1.Basics/compiler_op.html))

预处理器使用指令操作源代码,这些指令以井号(#)开头。这些指令向预处理器提供如何在实际编译之前修改或包含源代码部分的说明。预处理器的一个常见用途是通过宏定义。下面给您一个使用#define指令的例子:

#include <stdio.h>// This is a macro definition

#define SQUARE(x) ((x) * (x))

int main()

{

int num = 5;

int result = SQUARE(num);

printf("The square of %d is %d\n", num, result);

return 0;

}


在这个例子中:

  • #include <stdio.h>指令是一个预处理器指令,它将标准输入/输出库的内容包含在源代码中。
  • #define SQUARE(x) ((x) * (x))指令定义了一个名为SQUARE的宏。这个宏接受一个参数x,并将其扩展为表达式((x) * (x))。它将传递给它的值平方。

预处理后,代码看起来像这样:

#include <stdio.h>

int main()

{

int num = 5;

int result = ((num) * (num));

printf("The square of %d is %d\n", num, result);

return 0;

}

预处理器将所有出现的SQUARE(num)替换为相应的宏扩展((num) * (num))。这是一个简单的例子,但它说明了预处理器如何在实际编译过程开始之前通过替换代码模式来操作源代码。

链接器如何将各种目标代码和库组合在一起?

链接器通过解析程序不同部分之间的引用,将各种目标代码和库组合在一起,生成一个可执行文件。让我们考虑一个简单的例子,其中包含多个源文件和一个库。


假设我们有三个源文件:

  1. main.c

#include <stdio.h>

extern void hello();// Declaration of a function defined in another file

int main()

{

printf("Main program\n");

hello(); // Call to the external function

return 0;

}

2. hello.c


#include <stdio.h>

void hello()

{

printf("Hello, World!\n");

}

3. library.c

#include <stdio.h>

void libraryFunction()

{

printf("Library Function\n");

}

现在,让我们将每个源文件编译成目标文件:


gcc -c main.c -o main.o

gcc -c hello.c -o hello.o

gcc -c library.c -o library.o

-c 选项告诉编译器生成未链接的对象文件。接下来,我们可以使用链接器将这些对象文件链接在一起:

gcc main.o hello.o library.o -o my_program

在这个例子中:

  • main.ohello.olibrary.o 是从各自的源文件生成的目标文件。
  • 链接器(在这种情况下是 gcc )将这些目标文件作为输入,并将它们组合起来创建可执行文件 my_program
  • main.c 中调用的 hello() 函数,链接器通过将其链接到 hello.o 中的 hello() 函数的实际实现来解析引用。
  • 如果存在来自库的外部函数,如 library.o 中的 libraryFunction(),链接器也会解析这些引用。

在链接之后,我们有一个单一的可执行文件(在这个例子中是my_program),它包含了所有源文件和库的编译代码。当你运行./my_program时,它将产生以下输出:

Main program

Hello, World!

(图片来自Objected-Oriented Programming Using C++: An Elaborative Appraoch(https://icarus.cs.weber.edu/~dab/cs1410/textbook/1.Basics/compiler_op.html))



荟萃知识,滋养你我。

相关推荐

R语言数据挖掘实践——支持向量机的常用函数
R语言数据挖掘实践——支持向量机的常用函数

e1071包是R语言中用于支持向量机建模与分析的软件包,其主要用于支持向量机的模型构建,提供核心函数svm()来建立支持向量机的基础模型,并且可辅助使用pred...

2024-05-18 12:15 gowuye

R数据分析:如何做聚类分析,实操解析
R数据分析:如何做聚类分析,实操解析

Clusteringisabroadsetoftechniquesforfindingsubgroupsofobservationswi...

2024-05-18 12:14 gowuye

用R语言做数据分析——马赛克图
用R语言做数据分析——马赛克图

到目前为止,我们已经学习了许多可视化定量或连续型变量间关系的方法。但如果变量是类别型的呢?若只观察单个类别型变量,可以使用柱状图或者饼图;若存在两个类别型变量,...

2024-05-18 12:14 gowuye

用R语言做数据分析——方差分析基本概论
用R语言做数据分析——方差分析基本概论

在实际工作中,影响一件事的因素是很多的,我们总是希望通过各种试验来观察各种因素对试验结果的影响。例如,不同的生产厂家、不同的原材料、不同的操作规程,以及不同的技...

2024-05-18 12:14 gowuye

R语言数据分析实战:数据清洗与可视化
R语言数据分析实战:数据清洗与可视化

《R语言数据分析实战:数据清洗与可视化》是一本深入浅出的实践指南,专为对数据分析感兴趣的读者精心编撰。本书旨在帮助读者掌握R语言这一强大的统计分析工具,通过实例...

2024-05-18 12:13 gowuye

用R语言做数据分析——双因素方差分析
用R语言做数据分析——双因素方差分析

在双因素方差分析中,受试者被分配到两因子的交叉类别组中。以基础安装中的Tooth-Growth数据集为例,随机分配60只豚鼠,分别采用两种喂食方法(橙汁或维生素...

2024-05-18 12:13 gowuye

用R语言做数据分析——独立两样本和K样本检验
用R语言做数据分析——独立两样本和K样本检验

coin包简介对于独立性问题,coin包提供了一个进行置换检验的一般性框架,通过这个包,我们可以回答如下问题:响应值与组的分配独立吗?两个数值变量独立吗?两个类...

2024-05-18 12:13 gowuye

用R语言做数据分析——用回归做方差分析
用R语言做数据分析——用回归做方差分析

之前提到方差分析和回归都是广义线性模型的特例,之前文章的所有设计都可以用lm()函数来分析。为了更好地理解输出结果,需要弄明白在拟合模型时,R语言是如何处理类别...

2024-05-18 12:13 gowuye

数据分析R语言——数据结构
数据分析R语言——数据结构

数据分析R语言——数据结构数组数组(array)与矩阵类似,但是维度可以大于2.数组通过array()函数创建。形式如;myarray<-array(v...

2024-05-18 12:13 gowuye

R语言数据挖掘实践——关联分析的常用函数
R语言数据挖掘实践——关联分析的常用函数

arules和arulesViz是R语言中两个专用于关联分析的软件包。其中arules用于关联规则的数字化生成,提供Apriori和Eclat这两种快速挖掘频繁...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——判别分析的常用函数
R语言数据挖掘实践——判别分析的常用函数

判别算法在R语言中实现主要涉及4个软件包中的相关函数,它们依次为MASS、klaR、class和kknn。其中MASS包含有大量实用而先进的统计计数函数及适用数...

2024-05-18 12:12 gowuye

用R语言读取Excel、PDF和JSON文件,终于有人讲明白了
用R语言读取Excel、PDF和JSON文件,终于有人讲明白了

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——聚类分析的常用函数
R语言数据挖掘实践——聚类分析的常用函数

使用R语言可以轻松实现聚类分析,stats、cluster、fpc和mclust是常用的四个聚类分析软件包。stats主要包含一些基本的统计函数,如用于统计计算...

2024-05-18 12:12 gowuye

用R语言做数据分析——时间序列分类
用R语言做数据分析——时间序列分类

时间序列分类是根据已标注的时间序列建立一个分类模型,然后使用分类模型预测未标记时间序列的类别。从时间序列中抽取出新特征肯呢个有助于提高分类模型的性能。特征提取技...

2024-05-18 12:11 gowuye

一文看懂用R语言读取Excel、PDF和JSON文件(附代码)
一文看懂用R语言读取Excel、PDF和JSON文件(附代码)

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:11 gowuye

取消回复欢迎 发表评论: