【发布时间】: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呢?这样,使用这些常量的代码将与这些变量的存储实现分离。我应该提到,链接的文章有些误导。它混合了所有
inlinestaticextern并造成一团糟,而所有这些变体在不同的情况下都有帮助。 -
@VTT 从这个特定示例的角度来看,问题更多是关于了解模块的工作原理。但是,我认为将标量(在我的情况下为
Count)作为变量导出,而不使用 getter 并没有什么不好。
标签: c++ c++20 c++-modules