从模块导出全局常量的正确方法是什么?
What's a proper way to export a global constant from a module?
声明全局常量可能很方便,但在 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
这是正确的做法,还是我遗漏了什么?
你做对了。还要注意一个重要的特性,就像 C++17 中的 inline
,在 C++20 中通过 import
constrain initialization order(有或没有 inline
)表达的依赖关系。
声明全局常量可能很方便,但在 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
这是正确的做法,还是我遗漏了什么?
你做对了。还要注意一个重要的特性,就像 C++17 中的 inline
,在 C++20 中通过 import
constrain initialization order(有或没有 inline
)表达的依赖关系。