2014-10-10 73 views
1

页的有关跨文件共享常数变量,像这样C++入门第五版会谈60使用extern在文件间共享const时,为什么extern需要定义?

//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

与C不同,C++中的const默认为内部链接,在这种情况下,就好像它已被声明为静态一样。 extern被要求覆盖这个。 – 2014-10-10 01:13:03

+0

因此,extern会将变量更改为外部链接,从而允许跨文件共享该变量? – Matt 2014-10-10 01:16:14

+0

是的。另一种方法是仅在不带外部头的情况下声明const。对于一个简单的const(不是一个类)给定一个文字(例如'const int size = 5;'),这很好。但是,如果头文件中的常量是从函数初始化的,则将为包含头文件的每个源文件再次调用该函数,效率低下。 – 2014-10-10 01:18:05

回答

2

根据标准,

具有名称命名空间范围(3.3.6)具有如果是的名称...被显式声明的非易失性可变内部联动constconstexpr和既没有明确宣布 extern也没有先前声明有外部链接

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

提供用于变量的初始值设定将覆盖的extern

现在,这是有点不同。默认情况下,变量的声明也是一个定义,但extern取消了这个定义,因此您可以声明一个变量而不定义它(即,因为它的定义位于另一个翻译单元中)。但是,如果你有一个初始化器,那么它将覆盖extern,并且声明再次成为一个定义。这与上面关于内部和外部链接的规则没有真正的关系。

相关问题