为什么在函数内部的extern上提供显式初始值设定项不能覆盖extern

  • 本文关键字:extern 覆盖 不能 函数 内部 c++ extern
  • 更新时间 :
  • 英文 :


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

extern double pi = 3.1416; // definition

书中还指出,在函数内部的外部提供初始值设定项是一个错误。在我看来,这两种说法加在一起有点令人困惑,它们在我脑海中引发了以下问题:

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

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

根据C++Primer,我们可以为定义为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

最新更新