为什么不需要将标准C库分为头文件和实现文件?

时间:2018-07-10 01:57:01

标签: c class include c-standard-library

在C ++中创建类或在C中使用结构创建等效时,将其分为两个文件始终是一个好主意:头文件(用于声明)和一个实现文件(用于实际定义方法等)。

之所以这样做,是因为如果方法定义存在于多个文件中,则方法定义可能会发生冲突(并且包含保护措施无法防止这种情况发生,因为宏仅存在于它们所定义的文件中,并被复制到包含它们的文件中) ;包括防护措施,以防止在同一文件( )中多次包含相同的标头)

但是,似乎许多标准C库实际上都在定义事物。让我们以C中的stdlib.h为例。该库似乎定义了一个名为malloc的方法来分配内存。但是(当然),如果我在多个文件中包含stdlib.h,则似乎对malloc的方法定义没有冲突。

换句话说,如果我要使用自己的内存分配方法创建自己的库(假设它不是宏函数),则必须在mylib.h中声明它,并在{{1 }},但是由于某些原因,这似乎不适用于mylib.c

这是如何工作的?标准C库怎么能做到这一点,而用户定义的标头(不幸的是,我认为)却不能?

2 个答案:

答案 0 :(得分:2)

标准C库已经被编译成一个库,它可能被称为libc.soMSVCRT100.DLL之类的东西。您可以提供此文件,而不是提供编译器将从您的*.o文件生成的*.obj*.c文件。编译器将自动将此运行时库与每个程序链接在一起。

这也是其他库的工作方式。如果您具有已编译的OpenSSL库,则可以链接到该库并在源代码中#include头文件中查看其接口,例如函数名和原型。您不需要构建库的其他源文件。

您可以将源代码下载到C库的许多实现中,例如GNU libc。实际上,运行时是在*.c文件中实现的,您可以读取,修改,重新编译修补程序并将其提交给维护者,但可以提前将其编译到共享库中,并且编译器会链接到该库。 / p>

答案 1 :(得分:1)

这是一个古老的问题,但是以后应该有人遇到这个问题。

我的答案是: stdlib.h不是一个库。相反,它是一个大型库的头文件,该库定义了一种名为malloc的用于分配内存的方法。

也就是说:

stdlib.h仅包含其成员的声明(原型)。

库本身(在Linux-OS中为.a .so)包含malloc方法的实际定义(实现)(和其他)。

但是由于某些原因,这似乎不适用于stdlib.h。

可以,但是唯一的区别是,在您的示例中,您依赖于源文件(即mylib.c)来构建库。在问题中使用的标准C情况下,如果已经包含程序的头文件(即stdlib.h),它已经是应该链接到程序的库。