在C ++中创建类或在C中使用结构创建等效时,将其分为两个文件始终是一个好主意:头文件(用于声明)和一个实现文件(用于实际定义方法等)。
之所以这样做,是因为如果方法定义存在于多个文件中,则方法定义可能会发生冲突(并且包含保护措施无法防止这种情况发生,因为宏仅存在于它们所定义的文件中,并被复制到包含它们的文件中) ;包括防护措施,以防止在同一文件( )中多次包含相同的标头)
但是,似乎许多标准C库实际上都在定义事物。让我们以C中的stdlib.h
为例。该库似乎定义了一个名为malloc
的方法来分配内存。但是(当然),如果我在多个文件中包含stdlib.h
,则似乎对malloc的方法定义没有冲突。
换句话说,如果我要使用自己的内存分配方法创建自己的库(假设它不是宏函数),则必须在mylib.h
中声明它,并在{{1 }},但是由于某些原因,这似乎不适用于mylib.c
。
这是如何工作的?标准C库怎么能做到这一点,而用户定义的标头(不幸的是,我认为)却不能?
答案 0 :(得分:2)
标准C库已经被编译成一个库,它可能被称为libc.so
或MSVCRT100.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
),它已经是应该链接到程序的库。