初学c语言,在尝试用extern声明另一个文件中的结构体变量时遇到了一系列问题,请大家帮忙解惑。
我在a.c文件中定义了结构体类型A和2个A类型的变量a1、a2,如下:
struct A
{
char name;
};
struct A a1={'a'};
struct A a2={'b'};
然后我想在test.c中测试这两个变量:
extern struct A a1;
extern struct A a2;
我发现可以输出a1、a2的地址:
403010
403011
但是不能用sizeof计算他们的大小:
结果:invalid application of 'sizeof' to incomplete type 'struct A'
也不能访问a1.name:
结果:invalid use of undefined type 'struct A'
这里是什么原因?这两个变量应该创建好了在内存里对吗?编译器为何只知道a1、a2的地址?
这时如果我在test.c中重新定义一遍struct A:
struct A{};
我发现就可以输出a1、a2的地址不变,大小都为0,但还是不能访问a1.name。
结果:'struct A' has no member named 'name'
然后我再修改test.c中的定义为
struct A
{
int id;
};
然后就可以正常输出a1、a2的地址不变,大小为4,且能访问a1.id和a2.id,分别为‘a’和‘b’和之前定义的一样。
这里有些问题我实在搞不懂:
并不是说要修正程序,要使用其他文件的结构体变量的方法我也知道,只是想搞清楚这些问题的原因,希望大家帮忙解惑。
建议你看下这篇博客关于extern “C”