根据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