根据 C++入门我们可以为一个定义为extern的变量提供初始化器,但这样做会覆盖extern。一个有初始化器的extern就是一个定义。
extern double pi = 3.1416; // definition
书上也说了 在函数中为外部变量提供初始化器是一个错误。这两句话放在一起,我认为有点混乱,它们引起了我心中的以下疑问。
如果在任何函数外的外部提供初始化器都可以覆盖外部, 为什么在函数内的外部提供初始化器就不行?
我也不明白为什么有人既要获得一个添加extern关键字的声明,又要提供一个初始化器。这和定义一个变量并在其上提供一个初始化器不一样吗?如果不是,为什么?答案就是我们不能在函数内部的extern上提供初始化器的原因吗?
根据C++ Primer,我们可以在一个定义为的变量上提供一个初始化器。
extern
但这样做会推翻extern
.
只有部分是这样。
提供初始化器迫使声明成为一个定义(除了类的一些静态成员)。因此,它部分地抵消了 extern
,这通常会抑制定义。然而, extern
可以有其他的效果,而初始化器并不能使这些效果无效。
书上也说了,在函数内部的extern上提供初始化器是一个错误。
是的,是这样的。在块范围内。extern
是用来强制声明具有外部或内部链接(而不是声明一个局部变量)。然而,该语言禁止使用 界定 这样的变量在本地作用域中,你只能在那里声明它,并在命名空间作用域提供匹配的定义。你只能在那里声明它,并在命名空间作用域提供一个匹配的定义。如果你提供了一个初始化器,那么你试图在那里定义变量,这是不允许的。
如果在任何函数外的外部提供初始化器都可以覆盖外部,为什么在函数内部的外部提供初始化器就不可以呢?
正如我所解释的,这个前提是错误的。初始化器,在这两种情况下,都会使声明变成一个定义。在这两种情况下,它并没有覆盖以下事实,即 extern
影响 联动 的声明。
我也不明白为什么有人会想在声明中加入一个 "我 "的名字。
extern
关键字并提供一个初始化器。这和定义一个变量并提供一个初始化器不一样吗?如果不一样,为什么?
当我们使用 extern
和初始化器一起使用,通常是因为我们正在尝试定义一个 const
有外部链接的对象。见下文。
// At global scope:
const int c1 = 42; // definition with internal linkage
extern const int c2; // declaration with external linkage
extern const int c3 = 42; // definition with external linkage