首先要搞清楚的是.h头文件中都是一些声明性的语句,干的是不分配内存的事,所以头文件中有对函数的声明,有defeinse语句,有没有实例化的结构体定义,但是没有对变量的定义(比如 int a),有的只是对外变量的声明(extern int a)。
对于一个文件中调用另一个文件的全局变量,因为全局变量一般定义在原文件.c中,我们不能用#include包含源文件而只能包含头文件,所以常用的方法是用extern int a来声明外部变量。 还有一种方法是可以是在a.c文件中定义了全局变量int global_num ,可以在a.h头文件中写extern int global_num 这样其他源文件可以通过include a.h来声明她是外部变量就可以了
对于一个文件中调用另一个文件中的函数,最常用的是在.h头文件中声明函数,其他源文件可以通过#include该文件来声明函数并且在调用该函数时自动调到函数地址处执行。 也可以是在a.c中定义了该函数int fun 在b.c中用extern int fun来声明该函数是外部的 然后调用。
搞清楚概念的关键是理解声明,定义的区别,头文件的作用,还有变量和函数的不同是 int fun();和 extern int fun()都是声明 而变量是int a;是定义 extern int a 是声明。 用extern int fun()只是更明确点。
此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。