为什么在函数内部的 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
根据 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 theextern
.
只有一部分。
提供初始值设定项强制声明为定义(类 的某些静态成员除外)。因此,它部分抵消了 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