【问题标题】:implementation of C header files?C头文件的实现?
【发布时间】:2011-08-22 18:08:04
【问题描述】:

我正在学习 C 语言,并且正在查看 Linux 目录 /usr/include 中的一些头文件,例如 stdio.hstdlib.h 等。真正困扰我的是,我看到所有函数都使用 @987654324 定义@ 关键字,这意味着它们只被声明而没有任何定义,例如:

extern FILE *fopen (__const char *__restrict __filename,
                    __const char *__restrict __modes) __wur;

对于每个其他头文件中的每个其他函数也是如此。我的问题是,如果它们只被声明它们的实现在哪里?它们必须在某处实施,对吗?

【问题讨论】:

  • 头文件,尤其是系统头文件,不适合学习基本的C语言。先学习语言,不用担心像那里使用的语言滥用。
  • 实现在库中,任何关于 C 语言的基本文本都会告诉你。 ...“外部变量”——你的意思是“外部关键字”。
  • 请注意,extern 关键字在函数声明中是完全无关的。它所做的只是在编译器解析它时浪费磁盘空间和解析器时间。当然 cmets 和参数名称也这样做..
  • 你为什么不选择一个答案作为正确答案?

标签: c file header system implementation


【解决方案1】:

.h 文件包含声明,定义保存在某个目标文件中某处。更多信息可以在here找到。

【讨论】:

    【解决方案2】:

    那些被称为函数原型。他们告诉编译器该函数存在,但不知道在哪里(还)。编译器使用它来确保您正确调用函数,仅此而已。

    一旦编译器完成,链接器就会被调用。这就是魔法发生的地方。链接器确定哪个库具有函数的实际实现。在这种情况下,它可能会在标准库(在某些系统上称为 libc)中,它会被自动拉入。链接器完成它的工作,然后您对该函数的调用由库处理。

    如果原型存在,但找不到实现,则会出现链接器错误(类似于“未定义符号”的内容)。如果缺少原型,代码将编译,但您可能会收到有关它的警告(感谢 Jim Balter 提供有关此信息)。

    【讨论】:

    • “同样,如果函数未定义,但实现存在,你会得到一个编译器错误”——错误。实现就是定义。如果您的意思是“未声明”,则无需声明函数。 “undefined reference to...”——函数没有这样的错误信息。如果用法与函数的隐式声明不一致,您将收到(不同的)错误。
    • P.S. “如果定义了函数,但找不到实现”——应该是“如果函数被引用,...”
    • 更好,但是,再一次,对于缺少原型没有这样的错误——原型不是必需的;请测试您的声明。而且这两种说法仍然是错误的:仅仅拥有一个原型并不会产生链接器消息;你必须真正引用这个函数。
    • @Jim Balter:嗯,我以为我做到了。我回去做了一个小测试程序,上帝你是对的。我两次都遇到了错误,直到现在我才意识到这是链接器在两种情况下都给出了错误。我的错。
    • @KorayTugay 在任何“.c”文件中,只要生成的“.o”文件包含在链接阶段。这些符号名称是全局的。
    【解决方案3】:

    头文件只定义标准库函数的接口,而不是实现;它们(通常)不包含任何可执行代码。

    这取决于编译器和平台,但通常标准库函数已经被编译并收集到二进制文件中,您的代码会链接以生成可执行文件。

    如果您在使用 gcc 的 Linux 系统上,您可以在 /usr/lib 下找到这些库文件。 libc.a 通常包含大量 C 标准库函数(stdio、stdlib、字符串等)。数学函数单独存储在libm.a 中。一般情况下,gcc 会自动链接到/usr/lib/libc.a,所以你不用担心。如果需要使用数学库函数,则需要在命令行中添加-lm 以链接数学库。

    请注意,大多数实现并不提供库函数本身的源代码;你得到的只是预编译的二进制文件。

    【讨论】:

    • @JimBalter 说“实现就是定义。”在上面的评论中?
    • @KorayTugay:没错——函数定义(即函数的body)就是实现。声明是接口。头文件(通常)只包含函数声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多