我想知道 C 中预处理程序指令和库之间的区别是什么?
到目前为止,我知道预处理器指令用于包含外部文件。 (我的意思是这些外部文件可以是库吗?)
库是已经为我们编写的现成编译程序。 (因此我们需要预处理程序指令将它们包含在 C ?)
中答案 0 :(得分:3)
预处理程序指令出现在源代码中。有许多不同的指令。其中一个是#include
,用于包含头文件。头文件包含一组声明,通常用于库中的函数和类型(有时是变量)。但是,标题不是一个库。
库是已编译的目标文件的集合。 C标准不承认库存在(但它确实识别预处理器并定义所需的行为)。库在链接器(编译器)命令行中列出,通常使用-lname
表示法来查找库name
,其中-L
选项用于指定搜索库的位置。
请注意,标准C库中定义的大多数函数都是由链接器找到的,无需告知它们在哪里查找它们。数学函数是例外,由于历史原因(主要与内置浮点运算的机器有关 - 有时它们有FP协处理器,例如Intel 80386 + 80387,或者有时它们需要软件模拟缺少硬件)。在许多系统上,您需要指定-lm
来链接数学库;在其他方面,你没有(代码在主系统C库中)。
一般来说,标题与库中的目录不同(这将是一个混乱,非专业的项目,它将标题安装到与其库相同的目录中)。
特别是在C ++中,有些库没有预编译的目标文件;服务只通过标题定义。这些在C中不太常见。将文件视为标题而不是库是最明智的。标头定义了一组可供编译器使用的服务。库提供对此类服务的支持。 (如果您考虑它,或者查看您的系统,您会发现<stdio.h>
不包含fprintf()
的来源 - 举一个例子 - 但它确实声明{{1以这种方式,您的程序可以使用它,以便在运行时使用标准C库中的实际函数。)
动态链接(加载共享对象,也就是共享库或动态链接库(DLL)),在程序启动之后(fprintf()
之后)库文件在运行之前未加载被称为另一个完整的平台特定的bag'o'worms。
答案 1 :(得分:1)
预处理器命令可以执行许多操作,其中之一是包含文件,例如头文件。库主要提供编译代码来为您做事,这是非常不同的。但是,大多数库都要求您的代码包含库中的头文件,以便您的代码可以了解库中可用的类型和函数。
答案 2 :(得分:1)
有很多预处理器指令,我将在这里列出一些主题:
您可以找到有关预处理程序指令here
的更多信息