extern声明变量或函数


1:C++编程思想 42页

定义变量

int a;

这段代码有足够的信息让编译器为a分配空间,而且编译器也确实给整数a分配了空间。

声明变量

extern int a;

在变量定义前加extern关键字表示声明一个变量但不定义它 。它表示"这只是一个声明,它的定义在别的地方",关键字extern,它表示变量是在文件以外定义的,或在文件后面部分才定义.

 

声明函数

C/C++的函数声明就是给函数取名,指定函数的参数类型和返回值.例如

int func1(int, int);

第一个关键字是函数返回值类型:int .参数按其使用的顺序依次排在函数后面的括号内.分号说明声明结束,在这种情况下,它告诉编译器"就这些,这里没有函数定义."

在函数声明时,可以给参数命名(形参)。编译器会忽略这些参数名,但对程序员来说它们可以帮助记忆.例如:

int func1(int length, int width);

对于带空参数列表的函数,C和C++有很大的不同.在C语言中,声明

int func2();

表示"一个可带任意参数(任意数目,任意类型)的函数".这就妨碍了类型检查.而在C++语言中它就意味着"不带参数的函数".

 

定义函数

函数定义看起来像函数声明,但它还有函数体.函数体是一个用大括号括起来的语句集.大括号表示这段代码的开始和结束.为了定义函数体为空(函数体不含代码)函数func1(),应当写为:

int func1(int length, int width) {}

 

extern也可用于函数声明.例如:

extern int func1(innt length, int width);

这种声明方式和先前的func1()声明方式一样。因为没有函数体,编译器必定把它作为声明而不是函数定义。extern关键字对函数来说是多余的,可选的。C语言的设计者并不要求函数的声明使用extern,这可能有些令人遗憾;如果函数声明也要求使用extern,那么在形式上与变量声明更加一致,从而减少了混乱。

 

2:C++精髓:软件工程方法

在其他的语言中,声明与定义是同义词C++与C一样,认为两者之间有一些区别。定义使变量的名字对应了指定类型,并为变量分配了相应的存储空间,而声明只是使变量的名字与类型之间建立了对应关系,因为变量的存储空间在其他地方分配。例如,这种情况发生在一个由多文件组成的程序中,

在一个文件中定义了变量,而在另一个文件中使用了该变量。在使用这个变量的文件中,使用了关键字extern将变量定义为外部变量:

extern int count;

现在,我们可以在这个文件的源代码中使用变量count。在这个文件中所有对变量count的引用都会转换为在另一个文件中定义的变量的count的地址.

另外一个定义和声明之间的区别是,变量在程序中只能进行唯一的一次定义,而声明的次数可以任意多次。例如:

不允许这样进行重复定义int a; int a;

但是可以这样声明 extern int count; extern int count;

 229页.

函数的定义在一个程序中只能出现一次,但可以有多个函数原型。函数原型通常放在一个单独的工程目录的头文件中。这些文件在调用这些函数的源文件中用#include宏指令导入。C++允许我们在函数原型中不给出形式参数的命名。的确,参数名只有在函数的定义中才会用到。

void PutValues(int, int);

对程序员定义的函数而言,使用参数名可以为参数的作用提供帮助性的提示。

一些程序员并不在客户代码文件的开头处声明函数原形,而是在要调用函数的客户函数中作为文档的辅助手段进行声明。这可以清楚地告诉维护人员,就是这个函数(而不是同一个文件中的其他许多函数)使用了服务器函数。这是一个很重要的软件工程论题.例如:

void Client(void) {

    //声明本方法中要使用的函数,这个技巧很重要

    void PutValues(int value, int count);

    int val;

    int cnt;

    count << "Please enter the value and its count: ";

    cin >> val >> cnt;

    //调用服务器函数

    PutValues(val, cnt);

}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM