【问题标题】:An external struct declaration, but the struct definition is just above外部结构声明,但结构定义就在上面
【发布时间】:2021-05-11 16:36:39
【问题描述】:

我在这里仔细检查了所有类似的问题,我真的希望不要重复。 我对 stdio.h 的以下摘录很感兴趣:

typedef struct _iobuf {
    /* Members here omitted ... */
} FILE;
extern FILE _iob[20];

我们使用 struct 语法定义了一个名为 FILE 的新类型。紧接着,我们声明一个 FILE 类型的 extern 变量 _iob。因此,这个变量必须来自另一个地方。 但是,既然 FILE 的定义就在这个文件里,那怎么可能呢?我只看到两种可能性。 第一个是有类似的东西:

#include <stdio.h>
FILE _iob[20] = /* definition */

第二个是复制粘贴结构并声明变量的另一个源文件,我想我们可以省略一个非常糟糕的做法。

由于我是自学者,我很高兴收到确认我的理解。谢谢!

【问题讨论】:

  • typedef 定义了数据类型FILE 的布局。 extern 表示代码有其中一个可供使用,但它的位置在其他地方定义。
  • 是的,我明白你的意思。但不知何故,这样说听起来很“奇怪”:“我们只在这里定义一个类型,然后定义一个可以来自另一个来源的这种类型的变量”。我的意思是,那个来源怎么知道类型定义?我很高兴我问了,因为它有助于澄清一些 C 语法。祝你有美好的一天。
  • typedef 可以在其他地方重复而不会出现问题。是的,只在一个头文件中定义并在任何地方都包含它是正常的,但这不是必需的。
  • 但是'typedef'的重复不是一个非常糟糕的做法吗?关于剩余的评论,谢谢,非常清楚。
  • 是的,对同一事物有多个定义绝不是一个好主意。

标签: c struct stdio


【解决方案1】:

要么:

  • 在库源代码文件的某处,有您描述的文本,包含 &lt;stdio.h&gt; 后跟 FILE _iob[20] 的定义,或者
  • 在库源代码文件的某处,有一个_iob 的定义,它是用标准 C 以外的编程语言编写的。

后者可能是汇编语言、带有扩展的非标准 C 语言或其他东西。 C 的实现不需要只使用 C 源代码来定义自己。

一般来说,定义对象的源文件也包含其自己的标头是一种很好的做法。头文件的主要目的是告诉其他源文件相关源文件中定义的内容。但是在源文件中包含头文件还有另一个目的:编译器将同时看到头文件中的声明和源文件中的定义,如果它们不兼容,则会发出错误消息。因此,这提供了在构建库时捕获拼写错误或其他错误的检查。

【讨论】:

  • 精彩的解释:非常感谢! Ps:由于我没有足够的声誉,我似乎无法支持你的回答。我保证我将来会做,如果可能的话。
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多