6.8.3 函数的作用域和可见域
C++不允许在一个函数内部定义另一个函数,因此,在默认情况下,函数是全局的,可以在不同的文件间共享,比较后会发现,这和全局变量的用法有些类似,在使用一个函数前必须要对其进行声明,为了强调函数的外部存储特性,甚至可以在函数声明时使用关键字extern(经常省略)。
还可使用关键字static将函数声明为内部的,这样,只能在本文件中使用该函数,在函数定义和函数声明中都要使用static关键字,如下所示。
static int add(int,int); …… static int add(int m,int n) { …… }
static函数将屏蔽其他文件中外部定义的同名函数,即使外部定义了同名的函数,编译器仍会采用static函数,但是,不允许在同一文件中定义同名函数(重载除外)。
和全局变量一样,函数的声明位置与其可见域有很大关系,在块内对函数进行声明时,其可见性仅局限于该块,只能在该块内调用该函数;在外部(函数外部、类外部)对函数进行声明,具有“文件可见性”,从声明处开始,到文件结束的任何位置都可调用该函数;函数声明不能提供全局可见性,在调用函数之前,必须在当前文件或当前块中进行引用声明。
注意
如果函数定义和函数调用在同一文件中,且定义在前、调用在后,那么在本文件中,该函数的可见域为从变量定义到文件结束,如果函数定义在头部,那无须声明就可以在本文件的任何位置调用该函数。
函数的声明也可以有很多次,其可见域是所有声明提供的可见域的总和。
除了函数的作用域外,在第8章中会讲到,类的定义、声明和实例化,与其作用域和可见性有很大关系。同时,第5章中提及的结构也可以看成一种特殊的类。和类相关的作用域与可见域说明请参考第8章的相关内容。