C++中const限定符对存储类型的影响
在C++(但不是在C语言)中,const限定符对默认存储类型稍有影响。在默认情况下全局变量的链接性为外部的,但 const 全局变量的链接性为内部的。也就是说,在C++看来,全局const定义(如下述代码段所示)就像使用了 static说明符一样。
const int fingers = 10; //same as static const int fingers=10;
int main(void)
{
...
}
C++修改了常量类型的规则,让程序员更轻松。例如,假设将一组常量放在头文件中,并在同一个程序的多个文件中使用该头文件。那么,预处理器将头文件的内容包含到每个源文件中后,所有的源文件都将包含类似下面这样的定义:
const int fingers = 10;
const char * warning = "Wak!";
如果全局cnst声明的链接性像常规变量那样是外部的,则根据单定义规则,这将出错。也就是说,只能有一个文件可以包含前面的声明,而其他文件必须使用 extem 关键字来提供引用声明。另外,只有未使用 exter 关键字的声明才能进行初始化:
// extern would be required if const had external linkage
extern const int fingers; //can't be initialized
extern constchar * warning;
因此,需要为某个文件使用一组定义,而其他文件使用另一组声明。然而,由于外部定义的const 数据的链接性为内部的,因此可以在所有文件中使用相同的声明。参见【0voice C++】
因此,需要为某个文件使用一组定义,而其他文件使用另一组声明。然而,由于外部定义的const 数
据的链接性为内部的,因此可以在所有文件中使用相同的声明。
内部链接性还意味着,每个文件都有自己的一组常量,而不是所有文件共享一组常量。每个定义都是其所属文件私有的,这就是能够将常量定义放在头文件中的原因。这样,只要在两个源代码文件中包括同一个头文件,则它们将获得同一组常量。
如果出于某种原因,程序员希望某个常量的链接性为外部的,则可以使用 extem 关键字来覆盖默认的内部链接性:
extern const int states = 50; // definition with external linkage
在这种情况下,必须在所有使用该常量的文件中使用extem 关键字来声明它。这与常规外部变量不同,定义常规外部变量时,不必使用 extem 关键字,但在使用该变量的其他文件中必须使用exter。然而,请记住,鉴于单个 const在多个文件之间共享,因此只有一个文件可对其进行初始化。在函数或代码块中声明const 时,其作用域为代码块,即仅当程序执行该代码块中的代码时,该常量才是可用的。这意味着在函数或代码块中创建常量时,不必担心其名称与其他地方定义的常量发生冲突。