gpt4 book ai didi

c++ - 使用 extern 跨文件共享 const 时,为什么在定义中需要 extern?

转载 作者:行者123 更新时间:2023-11-30 04:00:28 32 4
gpt4 key购买 nike

C++ Primer 第 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?

最佳答案

按照标准,

A name having namespace scope (3.3.6) has internal linkage if it is the name of ... a non-volatile variable that is explicitly declared const or constexpr and neither explicitly declared extern nor previously declared to have external linkage

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

providing an initializer for a variable overrides the extern

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

关于c++ - 使用 extern 跨文件共享 const 时,为什么在定义中需要 extern?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290383/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com