使用extern从源文件访问struct时出错

时间:2014-11-13 11:25:39

标签: c struct

我是C的新手,我正在阅读extern。我使用它与内置数据类型,它工作正常,但是当我尝试使用它与结构,它给出了以下错误。我做错了什么?

bar.c

struct MyX
{
    int x;
} X;

foo.c的

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

gcc -o barfoo foo.c bar.c   error:无效使用未定义类型'struct MyX'

 X.x=80;
 ^

1 个答案:

答案 0 :(得分:2)

因为gcc -o barfoo foo.c bar.c(应该真的是gcc -Wall -Wextra -g foo.c bar.c -o barfoo;在编译代码时应始终启用所有警告和调试信息)正在编译两个编译单元({{1 }}和foo.c)然后linking他们object files在一起。

关于C声明,每个编译单元(或translation unit)都“自给自足”;你应该声明你在翻译单元中使用的每个非预定义类型(例如bar.c),通常是在一些常见的头文件中。

所以你应该

struct

struct MyX {
  int x;
};

extern struct MyX X; & foo.c。为了避免复制粘贴,您可能希望将其放在某些bar.c中,并在myheader.h#include "myheader.h"的开头使用foo.c,即使用

bar.c

请注意传统的使用include guard。详细了解C preprocessor,例如documentation of GNU cpp

某些编程语言(例如Ocaml,Rust,Go,...但不是C,还有C ++)有 modules packages 来处理这个问题。

PS。你应该研究用C编码的一些free software的源代码。你会学到很多东西。