C++ 初学者指南 第七篇(2)

来源:互联网 发布:帝国cms url规则 编辑:程序博客网 时间:2024/04/30 02:12
转载请标明出处:http://blog.csdn.net/zhangxingping

必备技能7.2:extern
    尽管到目前为止我们所编写的程序都是很短小的。然而,实际上,计算机程序要比我们编写的程序大很多。随着程序文件的增大,编译所需要的时间也会随之增大,甚至会达到让人们感到生气的程度。当这样的情况发生的时候,我们就应该把程序拆分中几个响度独立的文件。这样一来,对其中一个文件的修改不至于导致需要对所有文件都进行编译。实际上,我们只需要重新编译那个别修改的文件,然和和其它已经存在的目标文件一起进行链接即可。这种把程序拆分成多个文件的方法针对大型程序来说可以节省很多的时间。关键字extern就是可以支持这种方法的。下面我们就自己研究一下extern。
    当一个程序是有两个或者多个文件组成的时候,每个文件都必须知道程序中所使用到的全局变量的名称和类型。然而,我们是不能再每个文件中都对同一个全局变量都尽兴声明的。这是因为程序中只能还有一个同名的全局变量。因此,如果我们在每个文件中都对同一个全局变量进行声明,当链接器对这些文件进行链接的时候就会出现错误。链接器会发现有重复的全局变量,并终止对程序的链接。针对这种情况的处理方式就是在一个文件中队所有的全局变量进行声明,而在其它的文件中使用extern 来进行声明。如下所示:
文件1:

int x, y;chat ch;int main(){    //...}void func1(){    x = 123;}

文件2:

extern int x, y;extern char ch;void func22(){    x = y/10;}void func23(){    y = 10;}
    在文件1中声明了变量x,y和ch。在文件2中我们只是复制了全局变量的声明,并在前面加上了extern关键字。extern说明字使得一个模块可以感知到这些变量,而不是创建这些变量。换句话说,extern'关键字告知编译器这些全局变量的类型和名称,而不用为它们再次分配存储空间。当链接器把这两个模块链接起来的时候,所以对于外部变量的引用都是可以被正确解析的。

    目前我们还没有对变量的声明和变量的定义进行区分,然而在这里两者的区分是至关重要的。变量的声明就是声明变量的类型和名称;变量的定义则是给变量分配存储空间的。在大多数的情况下,变量的声明同时也是变量的定义。然而,通过在变量名称前面加上extern说名字的时候,我们就可以声明一个变量而不定义它(引者注:也就是不为它分配存储空间)。
 extern还有一个变种的用法,就是进行链接说明。它是被用作高速编译器如何编译函数的指令。缺省情况下,函数是作为C++样式的函数进行编译的,但是链接说明字可以让编译器以别的语言的形式来链接函数。通用的链接说明形式如下:
extern "language" 函数原型
其中的language就代表预期的语言。例如,下面的语句将是的函数mycfunc()将会以C语言的函数来进行链接:
extern "c" void mycfunc();
    所有的C++编译器都支持C和C++的链接。一些编译器还可能支持FORTAN,Pascal,或者BASIC的链接。采用下面的链接说明形式,我们一次可以指定多个函数:
extern "language" { 多个函数原型 }
   大多数情况下,我们是不需要进行链接说明的。