C 外部结构声明,但结构定义就在上面

C 外部结构声明,但结构定义就在上面,c,struct,stdio,C,Struct,Stdio,我仔细检查了这里所有类似的问题,我真的希望不要重复。 我对stdio.h的以下摘录很感兴趣: typedef struct _iobuf { /* Members here omitted ... */ } FILE; extern FILE _iob[20]; 我们使用struct语法定义了一个名为FILE的新类型。紧接着,我们声明了一个FILE类型的外部变量。因此,这个变量必须来自另一个地方。 但是,既然文件的定义在这个文件中,怎么可能呢?我只看到两种可能性。 第一个是有类似于:

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

typedef struct _iobuf {
    /* Members here omitted ... */
} FILE;
extern FILE _iob[20];
我们使用struct语法定义了一个名为FILE的新类型。紧接着,我们声明了一个FILE类型的外部变量。因此,这个变量必须来自另一个地方。 但是,既然文件的定义在这个文件中,怎么可能呢?我只看到两种可能性。 第一个是有类似于:

#include <stdio.h>
FILE _iob[20] = /* definition */
#包括
文件_iob[20]=/*定义*/
第二个是另一个源文件,其中复制粘贴了结构并声明了变量,我想这是一个非常糟糕的做法,我们可以忽略

由于我是一个自学者,我很高兴能得到我理解的确认。谢谢

或者:

  • 在库源代码文件的某个地方,有您描述的文本,包括
    ,后面是
    文件的定义\u iob[20]
    ,或者
  • 在库源代码文件的某个地方,有一个用标准C以外的编程语言编写的
    \u iob
    的定义
后者可能是汇编语言、带扩展的非标准C语言或其他语言。C的实现不需要仅使用C源代码来定义自身


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

typedef定义了数据类型
文件的布局。
extern
说代码有一个可以使用,但是它的位置在别处定义。是的,我理解你的意思。但不知何故,这样说听起来“很奇怪”,“我们只在这里定义一个类型,然后定义一个可以来自另一个源的这种类型的变量”。我是说,那个来源怎么知道类型定义?我很高兴我这样问,因为它在澄清一些C语法方面帮助很大。祝您有愉快的一天。
typedef
可以在其他地方重复使用,不会出现问题。是的,只在一个头文件中包含定义是正常的,但这不是一个要求。但是重复“typedef”不是一个非常糟糕的做法吗?关于剩下的评论,谢谢,非常清楚。是的,对同一件事有多个定义从来都不是一个好主意。精彩的解释:非常感谢!附言:看来我无法说服你的答案,因为我没有足够的声誉。如果可能的话,我保证将来会这样做。