【问题标题】:Is there still a use for extern const now that we have inline variables?既然我们有内联变量,还有用 extern const 吗?
【发布时间】:2020-06-07 00:48:22
【问题描述】:

我习惯写这种代码:

//myInclude.h
extern const Type var;
//mySource.cpp
#include "myInclude.h"
const Type var = ...;

...但是现在我可以写了

//myInclude.h
inline const Type var = ... ;

extern constextern 通常还有用吗? inline 变量是否已过时?

【问题讨论】:

标签: c++ inline extern c++20


【解决方案1】:

inline 没有使extern const 过时,因为它们不是“正交的”。

externinline 在应用于非模板 const 变量的声明(如 var)时,声明 var 没有内部链接。我想这就是为什么有人会认为inline 使extern 没有用处。

externinline 也有不同的语义:

  • extern 出现在声明中时,意味着该声明不是定义。这并不一定意味着该变量不是内联的或它是在其他翻译单元中定义的。

  • inline 表示声明是一个定义,同样的定义可能出现在其他翻译单元中。

因此,当定义可以出现在特定的翻译单元中时,extern const 变量声明可能仍然有用。这可用于提高大型项目的编译速度。

extern 的另一个用途是前向声明 const 变量。甚至是 constexpr 的前向声明:

 extern const int var;
 // some code that odr-use var
 inline constexpr int var = 10;

【讨论】:

  • 既然我们有内联,那么前向声明 const 或 constexpr 变量的实际用途是什么?
  • @TopologicalSort:您可能希望将变量作为常量表达式限制为一个翻译单元,更好地控制其初始化时间,或避免需要大量机器在每个使用该变量的翻译单元中进行初始化是必需的。
  • @TopologicalSort 同样,但即使这不是主题,对于具有其封闭类类型的静态成员,也需要前向声明 constexpr 变量。但是在这种情况下不需要 extern exemple inside the standard
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2015-06-30
  • 2020-05-03
相关资源
最近更新 更多