2013-12-19 46 views
-1

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

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

并且库已经为我们编写了编译好的程序。 (因此,我们需要预处理器指令将它们包含在C?)

+0

你也可以定义的#define或宏 –

+0

常量@ user2957713你的意思是常数(使用#) –

+0

是改变,常数的确:) –

回答

2

预处理指令出现在源码。有很多不同的指令。其中之一是#include,用于包含头文件。头文件包含一组声明,通常用于库中的函数和类型(有时是变量)。但是,一个标题是而不是一个库。

库是已编译的对象文件的集合。 C标准不能识别存在的库(但它确实识别预处理器并定义了所需的行为)。库在链接器(编译器)命令行中列出,通常使用-lname表示法来定位库name,并使用-L选项指定要搜索库的位置。

请注意,标准C库中定义的大多数函数都是由链接器找到的,而不需要知道它在哪里查找它们。数学函数例外是由于历史原因(主要涉及机器并不总是有浮点运算内置的—有时他们有FP协处理器,例如Intel 80386 + 80387,或者有时他们需要软件仿真缺少硬件)。在许多系统上,您需要指定-lm来链接数学库;在别人身上,你没有(代码在主系统C库中)。

一般来说,标题不能在与库相同的目录中找到(这将是一个杂乱的,不专业的项目,它将标题安装到与其库相同的目录中)。

特别是在C++中,有些库没有预编译的目标文件;这些服务仅通过标题定义。这些在C中不太常见。将文件视为标题而不是库是最明智的选择。头文件定义了一组可供编译器使用的服务。图书馆提供对这些服务的支持。 (如果你仔细想想,或者看一下你的系统,你会发现<stdio.h>不包括fprintf() —的源代码,其中有很多—的例子,但它确实声明了fprintf(),这样你的程序就可以使用它因此标准C库的实际功能将在运行时使用。)

库文件所在的动态链接(共享对象的加载,即共享库或动态链接库(DLL))直到运行时才加载,程序启动后(在调用main()后)是另一个完整的平台特定的bag'o'worms。

1

预处理器命令做了很多事情,其中​​之一是包含文件,如头文件。图书馆大多提供编译代码来为你做事,这是非常不同的。但是,大多数库会要求您的代码包含库中的头文件,以便您的代码可以了解库中可用的类型和功能。

1

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

  • 的#define:用于定义常量或marcro(带或不带参数)
  • #包括:其中包含文件(使用““)或库(使用<>)
  • 的#if的#ifdef:用于编译上当某些条件都充满的代码LY部分(他们八方通之后#ENDIF)
  • ...

你可以找到许多关于预处理指令here