为什么在函数内部的 extern 上提供显式初始化程序不会覆盖 extern?

Why does providing an explicit initializer on an extern inside a function not override extern?

根据 C++ Primer,我们可以为定义为 extern 的变量提供初始化程序,但这样做会覆盖 extern。具有初始值设定项的 extern 是一个定义:

extern double pi = 3.1416; // definition

书中还指出,在函数内部的 extern 上提供初始化器是错误的。这两个陈述在我看来有点混乱,它们在我脑海中产生了以下问题:

如果在任何函数外部的 extern 上提供初始值设定项都可以覆盖 extern,为什么不能在函数内部的 extern 上提供它?

我也不明白为什么有人想要同时获得一个添加了 extern 关键字的声明并提供一个初始化程序。这与定义一个变量并为其提供初始化程序不同吗?如果不是,为什么?答案是我们不能在函数内部的外部提供初始化程序的原因吗?

According to C++ Primer, we can provide an initializer on a variable defined as extern, but doing so overrides the extern.

只有一部分。

提供初始值设定项强制声明为定义(类 的某些静态成员除外)。因此,它部分抵消了 extern 的影响,后者通常会抑制清晰度。但是,extern 可以有其他效果,并且初始化程序不会取消这些效果。

It is also stated in the book that providing an initializer on an extern inside a function is an error.

是的。在块范围内,extern 用于强制声明具有外部或内部链接(而不是声明局部变量)。但是,该语言禁止 定义 局部范围内的此类变量。您只能在那里声明它,并在命名空间范围内提供匹配的定义。如果您提供了一个初始值设定项,那么您就是在尝试在那里定义变量,这是不允许的。

If providing an initializer on an extern outside any function can override the extern, why can providing it on an extern inside a function not?

正如我所解释的,这个前提是错误的。在这两种情况下,初始化程序都将声明变成定义。在这两种情况下,它都不会覆盖 extern 影响被声明实体的 链接 的事实。

I also don't understand why someone would want to both obtain a declaration adding the extern keyword and provide an initializer. Is it not the same as defining a variable and providing an initializer on it? If it is not, why?

当我们将 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