为什么在函数内部的extern上提供一个显式初始化器,而不是覆盖extern?

问题描述 投票:3回答:1

根据 C++入门我们可以为一个定义为extern的变量提供初始化器,但这样做会覆盖extern。一个有初始化器的extern就是一个定义。

extern double pi = 3.1416; // definition

书上也说了 在函数中为外部变量提供初始化器是一个错误。这两句话放在一起,我认为有点混乱,它们引起了我心中的以下疑问。

如果在任何函数外的外部提供初始化器都可以覆盖外部, 为什么在函数内的外部提供初始化器就不行?

我也不明白为什么有人既要获得一个添加extern关键字的声明,又要提供一个初始化器。这和定义一个变量并在其上提供一个初始化器不一样吗?如果不是,为什么?答案就是我们不能在函数内部的extern上提供初始化器的原因吗?

c++ extern
1个回答
3
投票

根据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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.