当使用extern在文件之间共享常量时,为什么定义中需要extern
When sharing a const across files using extern, why is extern needed on the definition?
C++Primer第5版第60页讨论了如何在文件之间共享常量变量,如so
//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呢?
根据标准,
如果名称空间作用域(3.3.6)是…的名称,则该名称具有内部链接。。。显式声明为
const
或constexpr
但均未显式声明的非易失性变量extern
之前未声明具有外部链接
因此,有一个特殊的规则,即当const
或constexpr
时,命名空间范围内的变量具有内部链接,即使它们本来具有外部链接。我不完全确定为什么存在这个规则,但我怀疑它是为了允许编译器内联const
变量,因此根本不为它们分配任何存储空间。extern
说明符显式重写了这一点,并使变量再次具有外部链接。
为变量提供初始值设定项会覆盖外部
现在有点不同了。默认情况下,变量的声明也是一个定义,但extern
禁止这样做,因此您可以在不定义变量的情况下声明变量(即,因为其定义在另一个翻译单元中)。但是,如果您有一个初始值设定项,那么它会覆盖extern
,并且声明再次成为一个定义。这实际上与上面关于内部和外部联系的规则无关。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 为什么这"undefined extern variable"不会导致 C++17 中出现链接器错误?
- 关于std::cout,为什么使用"extern"比"singleton pattern"
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 如果仅使用一个翻译单元使用Extern模板类,为什么我不会遇到链接错误
- 为什么他们坚持在下面的示例中使用"extern"说明符?
- 为什么"extern int &c;"工作正常?
- 从C++链接到 C 库:为什么并不总是需要 extern?
- 为什么EXTERN_C宏在其C形式中省略了"EXTERN"
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 为什么C++编译器允许 extern 关键字与定义相结合
- 为什么这个 extern "C" 函数不能使用 python ctypes 工作?
- 当使用extern在文件之间共享常量时,为什么定义中需要extern
- 为什么要定义"SQLITE_EXTERN extern"
- 将 dll 方法从C++导出到 C#。为什么我需要:" extern " C " "
- 为什么跨多个文件共享时不需要用"extern"装饰"const char *"
- 为什么使用static、extern和不使用static声明的变量包含不同的值
- 为什么"extern template"不能与shared_ptr合作?
- 为什么"extern const int n;"不能按预期工作?