extern const int fingers;
extern const char . warning:
将包含类似下面这样的定义:
const int fingers = 10:
const char . warning - "Wak! ":
如果全局 const 声明的链接性像常规变量那样是外部的,则这将出错,因为不能在多个文件中定义同
·个全局变量。也就是说,只能有 ·个文件可以包含前面的声明,而其他文件必须使用extem关键字来提
供引用声明。另外,只有未使用extern关键字的声明才能进行初始化:
// extern would be required if const had external linkage
// can't be initialized
因此,需要为某个文件使用-组定义,而其他文件使用另一组声明。然而,由于外部定义的const 数
据的链接性为内部的,因此可以在所有文件中使用相同的声明。
内部链接性还意味着,每个文件都有自己的 -- 组常量,而不是所有文件共享一组常量。每个定义都是
其所属文件私有的,这就是能够将常量定义放在头文件中的原因。这样,只要在两个源代码文件中包括同
一个头文件,则它们将获得同 组常量。
如果出于某种原因,程序员希望某个常量的链接性为外部的,则可以使用extern关键字来覆盖默认的
内部链接性:
extern const int states - 50: // external linkage
在这种情况下,必须在所有使用该常量的文件中使用extem关键字来声明它。这与常规外部变量不同,
定义常规外部变量时,不必使用extern关键字,但在使用该变量的其他文件中必须使用extern。另外,与
常规变量不同的是,可以初始化extern const变量。实际上,必须这样做,因为const数据必须初始化。
在函数或代码块中声明const时,其作用域为代码块,即仅当程序执行该代码块中的代码时,该常
量才是可用的。这意味着在函数或代码块中创建常量时,不必担心其名称与其他地方定义的常量发生
冲突。
9.2.5 函数和链接性
和变量一样,函数也有链接性,虽然可选择的范围比变量小。和C语言一样,C++不允许在一个函数
中定义另外 个函数,因此所有函数的存储持续性都自动为静态的,即在整个程序执行期间都一直存在。
在默认情况下,函数的链接性为外部的,即可以在文件间共字。实际上,可以在函数原型中使用关键字extern
来指出函数是在另一个文件中定义的,不过这是可选的(要让程序在另一个文件中查找函数,该文件必须
作为程序的组成部分被编译,或者是由链接程序搜索的库文件)。还可以使用关键字static将函数的链接性
设置为内部的,使之只能在·个文件中使用。必须同时在原型和函数定义中使用该关键字:
static int private (double x):
static int private (double x)
这意味着该函数只在这个文件中可见,还意味着可以在其他文件中定义同名的的函数。和变量一样,
在定义静态函数的文件中,静态函数将覆盖外部定义,因此即使在外部定义了同名的函数,该文件仍将使
用静态函数。
C++有一个“单定义规则”,即对于每个非内联函数,程序中只能包含一个定义。对于链接性为外部的
函数来说,这意味着在多文件程序中,只能有一个文件包含该函数的定义,但使用该函数的每个文件都应
包含其函数原型。
内联函数不受这项规则的约束,这允许程序员能够将内联函数的定义放在头文件中。这样,包含了头
文件的每个文件都有内联函数的定义。不过,C++要求同一个函数的所有内联定义都必须相同。