我是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;
^
答案 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的源代码。你会学到很多东西。