【问题标题】:What's a proper way to export a global constant from a module?从模块导出全局常量的正确方法是什么?
【发布时间】:2020-02-16 10:26:10
【问题描述】:

声明全局常量可能很方便,但在 C++ 中并不容易。例如。见this recent article at Fluent C++。它主要解释了如何做到这一点,但没有提到 C++20 模块。

在命名空间级别的常规头文件中,我会像这样声明一个常量:

// Constants.h
inline constexpr int Count = 42;
inline const std::vector<int> Numbers = { 1, 2, 3 };  // cannot use constexpr

这里我需要inline,因为这些符号可能包含在多个翻译单元中。 IIUC,导出符号的模块定义单元是一个单独的翻译单元。所以我会简单地声明如下:

// Constants.ixx
export module constants;

export constexpr int Count = 42;
export const std::vector<int> Numbers = { 1, 2, 3 };  // cannot use constexpr

这是正确的做法,还是我错过了什么?

【问题讨论】:

  • 为什么不导出getter呢?这样,使用这些常量的代码将与这些变量的存储实现分离。我应该提到,链接的文章有些误导。它混合了所有 inline static extern 并造成一团糟,而所有这些变体在不同的情况下都有帮助。
  • @VTT 从这个特定示例的角度来看,问题更多是关于了解模块的工作原理。但是,我认为将标量(在我的情况下为 Count)作为变量导出,而不使用 getter 并没有什么不好。

标签: c++ c++20 c++-modules


【解决方案1】:

你做对了。还要注意一个重要的特性,就像 C++17 中的 inline,在 C++20 中通过 import constrain initialization order(有或没有 inline)表达依赖关系。

【讨论】:

  • 使用inline 从模块中导出某些内容有什么意义?我认为它只是不适用于模块。
  • @Mikhail: inline 确实适用于模块中的 functions:计划将其应用于 impose certain useful restrictions 以改进优化。它对变量没有任何用处,我也没有说它有用。
  • @Mikhail:经过进一步思考,在模块中将静态数据成员定义为inline 仍然有意义(为方便起见);这意味着在另一个模块单元中没有单独的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2017-10-11
  • 2020-05-26
  • 2020-10-16
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多