在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程序编译实现后在指标代码中命名规定不同。