关于extern结构体变量时遇到的问题!(语言-c语言)

初学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’和之前定义的一样。

这里有些问题我实在搞不懂:

  1. 从结果来看,已经在a.c文件中成功创建a1、a2变量,分配了内存也初始化了,为什么我在test.c中只能访问他俩的地址?
  2. extern 结构体变量的原理是什么?
  3. 为何不能像extern声明其他变量一样extern声明结构体变量?
  4. 为什么我可以再定义一编结构体类型A,不会重复定义?
  5. a1、a2明显被转型成为在test.c中新定义的结构体类型A,这什么原理?

并不是说要修正程序,要使用其他文件的结构体变量的方法我也知道,只是想搞清楚这些问题的原因,希望大家帮忙解惑。

建议你看下这篇博客关于extern “C”