使用extern在文件之间共享const时,为什么定义需要extern?

时间:2014-10-10 01:09:23

标签: c++

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?

1 个答案:

答案 0 :(得分:2)

根据标准,

  

具有命名空间作用域(3.3.6)的名称具有内部链接,如果它是......一个显式声明为constconstexpr并且未明确声明的非易失性变量的名称   extern也未声明具有外部链接

因此,有一个特殊规则,即constconstexpr时,命名空间范围内的变量具有内部链接,即使它们具有外部链接。我不完全确定为什么这个规则存在,但我怀疑是允许编译器内联const变量,因此根本不为它们分配任何存储。 extern说明符显式覆盖了这个,并使变量再次具有外部链接。

  

为变量提供初始值设定项会覆盖extern

现在这有点不同了。默认情况下,变量的声明也是一个定义,但extern会对此进行抑制,因此您可以在不定义变量的情况下声明变量(即因为其定义位于另一个转换单元中)。但是如果你有一个初始化器,那么它会覆盖extern,并且声明再次成为一个定义。这与上面关于内部和外部联系的规则没有关系。