在C语言中,修饰符extern用在变量或者函数的声明前,用来讲明“此变量/函数是在别处定义的,要在此处引用”。1. extern修饰变量的声明。举例来讲,若是文件a.c须要引用b.c中变量int v,就能够在a.c中声明extern int v,而后就能够引用变量v。这里须要注意的是,被引用的变量v的连接属性必须是外连接(external)的,也就是说a.c要引用到v,不仅是取决于在a.c中声明extern int v,还取决于变量v自己是可以被引用到的。这涉及到c语言的另一个话题--变量的做用域。可以被其余模块以extern修饰符引用到的变量一般是全局变量。还有很重要的一点是,extern int v能够放在a.c中的任何地方,好比你能够在a.c中的函数fun定义的开头处声明extern int v,而后就能够引用到变量v了,只不过这样只能在函数fun做用域中引用v罢了,这仍是变量做用域的问题。对于这一点来讲,不少人使用的时候都心存顾虑。好像extern声明只能用于文件做用域似的。2. extern修饰函数声明。从本质上来说,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。若是文件a.c须要引用b.c中的函数,好比在b.c中原型是int fun(int mu),那么就能够在a.c中声明extern int fun(int mu),而后就能使用fun来作任何事情。就像变量的声明同样,extern int fun(int mu)能够放在a.c中任何地方,而不必定非要放在a.c的文件做用域的范围中。对其余模块中函数的引用,最经常使用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪一个函数就用extern声明哪一个函数。这大概是KISS原则的一种体现吧!这样作的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程当中,这种差别是很是明显的。3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。好比在C++中调用C库函数,就须要在C++程序中用extern “C”声明要引用的函数。这是给连接器用的,告诉连接器在连接的时候用C函数规范来连接。主要缘由是C++和C程序编译完成后在目标代码中命名规则不一样。