C ++第5版第60页讨论了如何在文件中共享const变量
//file_1.cc
extern const int bufSize = fcn();
//file_1.h
extern const int bufSize;
什么时候定义bufSize,在file_1.cc上extern的目的是什么?我理解file_1.cc会定义它,但同一本书的第45页说为变量提供初始值设定项会覆盖extern,那么为什么有必要在const的定义中使用extern?
答案 0 :(得分:2)
根据标准,
具有命名空间作用域(3.3.6)的名称具有内部链接,如果它是......一个显式声明为
const
或constexpr
并且未明确声明的非易失性变量的名称extern
也未声明具有外部链接
因此,有一个特殊规则,即const
或constexpr
时,命名空间范围内的变量具有内部链接,即使它们具有外部链接。我不完全确定为什么这个规则存在,但我怀疑是允许编译器内联const
变量,因此根本不为它们分配任何存储。 extern
说明符显式覆盖了这个,并使变量再次具有外部链接。
为变量提供初始值设定项会覆盖extern
现在这有点不同了。默认情况下,变量的声明也是一个定义,但extern
会对此进行抑制,因此您可以在不定义变量的情况下声明变量(即因为其定义位于另一个转换单元中)。但是如果你有一个初始化器,那么它会覆盖extern
,并且声明再次成为一个定义。这与上面关于内部和外部联系的规则没有关系。