我想知道C中的预处理器指令和库之间有什么区别?预处理器指令和库之间的区别
到目前为止,我知道预处理指令用于包含外部文件。 (我的意思是这些外部文件可以是库?)
并且库已经为我们编写了编译好的程序。 (因此,我们需要预处理器指令将它们包含在C?)
我想知道C中的预处理器指令和库之间有什么区别?预处理器指令和库之间的区别
到目前为止,我知道预处理指令用于包含外部文件。 (我的意思是这些外部文件可以是库?)
并且库已经为我们编写了编译好的程序。 (因此,我们需要预处理器指令将它们包含在C?)
预处理指令出现在源码。有很多不同的指令。其中之一是#include
,用于包含头文件。头文件包含一组声明,通常用于库中的函数和类型(有时是变量)。但是,一个标题是而不是一个库。
库是已编译的对象文件的集合。 C标准不能识别存在的库(但它确实识别预处理器并定义了所需的行为)。库在链接器(编译器)命令行中列出,通常使用-lname
表示法来定位库name
,并使用-L
选项指定要搜索库的位置。
请注意,标准C库中定义的大多数函数都是由链接器找到的,而不需要知道它在哪里查找它们。数学函数例外是由于历史原因(主要涉及机器并不总是有浮点运算内置的—有时他们有FP协处理器,例如Intel 80386 + 80387,或者有时他们需要软件仿真缺少硬件)。在许多系统上,您需要指定-lm
来链接数学库;在别人身上,你没有(代码在主系统C库中)。
一般来说,标题不能在与库相同的目录中找到(这将是一个杂乱的,不专业的项目,它将标题安装到与其库相同的目录中)。
特别是在C++中,有些库没有预编译的目标文件;这些服务仅通过标题定义。这些在C中不太常见。将文件视为标题而不是库是最明智的选择。头文件定义了一组可供编译器使用的服务。图书馆提供对这些服务的支持。 (如果你仔细想想,或者看一下你的系统,你会发现<stdio.h>
不包括fprintf()
—的源代码,其中有很多—的例子,但它确实声明了fprintf()
,这样你的程序就可以使用它因此标准C库的实际功能将在运行时使用。)
库文件所在的动态链接(共享对象的加载,即共享库或动态链接库(DLL))直到运行时才加载,程序启动后(在调用main()
后)是另一个完整的平台特定的bag'o'worms。
预处理器命令做了很多事情,其中之一是包含文件,如头文件。图书馆大多提供编译代码来为你做事,这是非常不同的。但是,大多数库会要求您的代码包含库中的头文件,以便您的代码可以了解库中可用的类型和功能。
有很多预处理指令,我将列出一些主题在这里:
你可以找到许多关于预处理指令here
你也可以定义的#define或宏 –
常量@ user2957713你的意思是常数(使用#) –
是改变,常数的确:) –