预处理程序指令和库之间的区别

时间:2013-12-19 23:43:48

标签: c static-libraries c-preprocessor preprocessor-directive

我想知道 C 中预处理程序指令和库之间的区别是什么?

到目前为止,我知道预处理器指令用于包含外部文件。 (我的意思是这些外部文件可以是库吗?)

库是已经为我们编写的现成编译程序。 (因此我们需要预处理程序指令将它们包含在 C ?)

3 个答案:

答案 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)

有很多预处理器指令,我将在这里列出一些主题:

  • #define :用于定义常量或marcro(带或不带参数)
  • #include :包含文件(使用“”)或库(使用&lt;&gt;)
  • #if #ifdef :用于在填写某些条件时仅编译部分代码(它们总是后跟#endif)
  • ...

您可以找到有关预处理程序指令here

的更多信息
相关问题