<思路2>:在头文件a.h中声明var,然后在b.c中#include。这种方法行吗?分析编译过程看看。a.c编译肯定不会有错,b.c编译时因为包含了a.h中var的声明,因此编译器得到了var的变量原型(即编译器知道有一个变量名叫var,并且知道这个var的类型信息等,但编译器不知道这个var在哪里定义的。不过编译器根本不需要知道这个变量到底在哪里定义的,交给连接器同志去处理这些吧!),因此只要在b.c中使用该var的地方符合a.h中var的声明,b.c即可顺利通过编译。至此两个源文件编译通过,进入第二阶段连接。连接器在连接时会为b.o中引用var的部分寻找var的定义体。此时连接器很轻松的发现a.o中即有一个名为var的全局变量的定义体,因此连接器确定了a.o和b.o中的var为同一个变量。至此问题圆满解决。思路2成功。
<思路3>:使用extern关键字。a.c中情况不变,仍然定义全局变量var(例如,int var;),b.c中使用extern关键字声明变量var(extern int var;)。注意没有使用头文件中的声明,这样可以吗?同样的,先分析a.c和b.c各自的编译过程,再分析连接过程。编译时a.c当然没问题,b.c中因为先使用extern int var;对var进行了声明(声明的意义和思路2中相同)因此编译阶段也没问题。连接阶段和思路2相同,因此连接成功。至此,思路3成功。