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

问题描述 投票:0回答:2

在 C++ 中创建类或在 C 中使用structs创建等价时,最好将其分为两个文件:头文件(用于声明)和实现文件(用于实际定义方法和这样)。

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

然而,似乎许多标准 C 库实际上定义了一些东西。让我们以 C 中的

stdlib.h
为例。这个库似乎定义了一个名为
malloc
的方法来分配内存。但是(当然)如果我在多个文件中包含
stdlib.h
,则 malloc 的方法定义似乎不会发生冲突。

换句话说,如果我用自己的内存分配方法创建自己的库(假设它不是宏函数),我必须在

mylib.h
中声明它,并在
mylib.c
中实际定义它,但这并不由于某种原因似乎适用于
stdlib.h

这是如何运作的?为什么标准 C 库可以做到这一点,但用户定义的标头(不幸的是,在我看来)却不能?

c class include c-standard-library
2个回答
2
投票

标准C库已经被编译成一个库,可能被称为

libc.so
MSVCRT100.DLL
之类的东西。您可以提供此文件,而不是编译器从您的
*.o
文件生成的
*.obj
*.c
文件。编译器会默默地自动将该运行时库与每个程序链接起来。

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


您可以下载许多 C 库实现的源代码,例如 GNU libc。事实上,运行时是在

#include

文件中实现的,您可以读取、修改、重新编译这些文件并将补丁提交给维护人员,但它会提前编译到共享库,并且您的编译器会链接到该库。

    


1
投票
*.c

不是
图书馆。相反,它是一个大库的头文件,它定义了一个名为 stdlib.h 的方法来分配内存。
即:

malloc

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

库本身(Linux操作系统中的

stdlib.h

*.a
)包含
*.so
方法(及其他方法)的实际定义(实现)。

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

确实如此,但唯一的区别是,在您的示例中,您依赖源文件(即
malloc

)来构建库。而在您问题中使用的标准 C 情况下,如果您包含其头文件(即

mylib.c
),它已经是一个应该链接到您的程序的库。
    

© www.soinside.com 2019 - 2024. All rights reserved.