C 使用extern从源文件访问结构时出错

C 使用extern从源文件访问结构时出错,c,struct,C,Struct,我是C语言的新手,我在读关于extern。我将它与内置数据类型一起使用,效果很好,但是当我尝试将它与结构一起使用时,它给出了以下错误。我做错了什么 bar.c struct MyX { int x; } X; extern struct MyX X; int main() { X.x=80; return 0; } foo.c struct MyX { int x; } X; extern struct MyX X; int main() { X.x

我是C语言的新手,我在读关于
extern
。我将它与内置数据类型一起使用,效果很好,但是当我尝试将它与结构一起使用时,它给出了以下错误。我做错了什么

bar.c

struct MyX
{
    int x;
} X;
extern struct MyX X;
int main()
{
    X.x=80;
    return 0;
}
foo.c

struct MyX
{
    int x;
} X;
extern struct MyX X;
int main()
{
    X.x=80;
    return 0;
}
gcc-o barfoo.c bar.c
错误:
未定义类型“struct MyX”的使用无效


因为
gcc-o barfoo.c bar.c
(实际上应该是
gcc-Wall-Wextra-g foo.c bar.c-o barfoo
;在编译代码时应该始终启用所有警告和调试信息)正在编译两个编译单元(
foo.c
bar.c
),然后将它们合并在一起

关于C声明,每个编译单元(or)都是“自给自足”的;您应该声明在翻译单元中使用的每个非预定义类型(例如,
struct
),通常是在一些公共头文件中

所以你应该

struct MyX {
  int x;
};

foo.c
bar.c
中。为了避免复制粘贴,您可能希望将其放在一些
myheader.h
中,并在
foo.c
bar.c
的开头使用
#包括“myheader.h”
,即使用

// file myheader.h
#ifndef MYHEADER_INCLUDED
#define MYHEADER_INCLUDED
struct MyX {
  int x;
};
extern struct MyX X;
#endif /* MYHEADER_INCLUDED */
请注意传统用法。阅读更多有关的信息,例如

一些编程语言(例如Ocaml、Rust、Go等,但不是C,也不是C++)具有处理该问题的模块或包


另外,你应该学习一些用C编写的代码的源代码。你会学到很多。

请在你的问题标题上多加努力。没有人会找到这个标题的问题。仍然显示相同的错误。如何在头文件中声明此非预定义类型结构?