局部变量和全局变量
每一个变量都有其有效作用范围,这就是变量的作用域,在作用域以外是不能访问这些变量的。
局部变量
在一个函数内部定义的变量是局部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用他们,在此函数以外是不能使用这些变量的。
同样,在复合语句中定义的变量只在本复合语句范围内有效,这些内部变量称为局部变量。
需要注意的是
1、主函数main中定义的变量也只在主函数中有效,不会因为在主函数中定义而在整个文件或程序中有效,在主函数中也不能使用其它函数中定义的变量。
2、不同函数中可以使用同名变量,他们代表不同的对象,互不干扰。
3、可以在一个函数内的复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为分程序或程序块。
4、形式参数也是局部变量。
5、在函数原型中出现的参数名,并不是实际存在的变量,不能被引用,编译系统对函数声明中的参数名是忽略的,即使在调用函数时也没有为他们分配存储单元。
全局变量
在函数内部定义的变量是局部变量,而在函数外部定义的变量是外部变量,也称全局变量。全局变量的有效范围为从定义变量的位置开始到本源文件结束。
在一个函数中既可以使用本函数中定义的局部变量,又可以使用有效的全局变量。
需要注意的是
1、全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能使用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其它函数,使其它函数中的同名变量的值也同时改变,这相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加函数间数据传递的渠道。
2、不必要时不要使用全局变量。因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。全局变量使函数的通用性降低了,因为在执行函数时要受到外部变量的影响。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去,若该外部变量与其它文件的变量同名,就会出现问题,降低了程序的可靠性和通用性。
在程序设计中,在划分模块时要求模块的内聚性强、与其它模块的耦合性弱,即模块的功能要单一,与其它模块的相互影响要尽量少。
一般要求把程序中的函数做成一个封闭体,除了可以通过实参-形参的渠道与外界发生联系外,没有其它渠道,这样的程序移植性好,可读性强。
使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬间各个全局变量的值。在各个函数执行时都可能改变全局变量的值,程序容易出错。
3、如果在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,会不起作用,此时可以使用局部变量。
4、变量的有效范围称为变量的作用域。变量有四种不同的作用域,分为文件作用域、函数作用域、块作用域和函数原型作用域。文件作用域是全局的,其它作用域是局部的。
变量的声明和定义
对变量而言,在声明部分出现的变量有两种情况,一种是需要建立存储空间的,如int a;,称为定义性声明,或称为定义。另一种是不需要建立存储空间的,如extern int a;,称为引用性声明。
广义来讲,声明包括定义,但并非所有的声明都是定义。一般为了叙述方便,把建立存储空间的声明称为定义,把不需要建立存储空间的声明称为声明。这里指的声明是狭义的,即非定义性声明。
外部变量定义和外部变量声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。系统根据外部变量的定义分配存储单元。对外部变量的初始化只能在定义时进行,而不能在声明时进行。
所谓声明,其作用是向编译系统发出一个信息,声明该变量是一个在后面定义的外部变量,仅仅是为了提前引用该变量而作的声明。
需要注意的是,使用auto,register,static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。
内部函数和外部函数
函数本质上是全局的,因为一个函数要被另外的函数调用,但是也可以指定函数只能被本文件调用,而不能被其它文件调用。根据函数能否被其它源文件调用,将函数区分为内部函数和外部函数。
内部函数
如果一个函数只能被本文件中其它函数所调用,则称为内部函数。
在定义内部函数时,在函数名和函数类型的前面加static。
函数首部的一般格式为
static 类型标识符 函数名(形参表)
内部函数又称静态函数,使用内部函数,可以使函数只局限于所在文件。如果在不同的文件中有同名的内部函数,互不干扰。这样不同的人可以分别编写不同的函数,而不必担心所有函数名是否会与其它文件中的函数相同。通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们之前都冠以static使之局部化,其它文件不能引用。
外部函数
1、在定义函数时,如果在函数首部的左端冠以关键字extern,则表示此函数是外部函数,可供其它文件调用。如果在定义函数时省略extern,则默认为外部函数。
2、在需要调用此函数的文件中,用extern声明所用的函数是外部函数。
使用extern声明就能够在一个文件中调用其它文件中定义的函数,或者说把该函数的作用域扩展到本文件。
extern声明的形式就是在函数原型基础上加关键字extern。由于函数在本质上是外部的,在程序中经常要调用其它文件中的外部函数,为方便编程,C++允许在声明函数时省写extern。
用原型函数能够把函数的作用域扩展到定义该函数的文件之外,只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统,该函数在本文件中稍后定义,或在另一个文件中定义。
头文件
头文件的内容
头文件一般包含:对类型的声明、函数声明、内置函数的定义、宏定义、全局变量定义、外部变量声明或其它头文件
由于有了#include指令,就可以把不同的文件组合到一起,形成一个文件,因此说,头文件是源文件之间的接口。
关于C++标准库和头文件的形式
新的C++标准库中的头文件不再包括后缀.h,但为了使大批已有的C程序能继续使用,许多C++编译系统保留了C的头文件。建议尽量使用符合C++标注的形式。
如果用户自己编写头文件,可以使用.h作后缀,便于区分哪些头文件使属于C++标准库的,哪些头文件使用户自编或别人提供的。