c++ - 从模块导出全局常量的正确方法是什么?
问题描述
声明全局常量可能很方便,但在 C++ 中并不容易。例如,请参阅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
这是正确的做法,还是我错过了什么?
解决方案
你做对了。还要注意一个重要的特性,就像inline
在 C++17 中一样,依赖关系通过C++20 中的import
约束初始化顺序(有或没有inline
)来表达。
推荐阅读
- postgresql - 在 postgres 中将文本/字符串转换为日期时,会生成随机日期
- xamarin - 我可以在 Xamarin 中使用控件模板之类的东西来包围新对象吗?
- c# - 通过 C# 7.x 语法添加,是否有“x ?? (x = MakeX())”版本,其中 x 是通过 out 参数分配的?
- java - 为什么 lambda 在抛出运行时异常时会更改重载?
- typescript - Typescript:通用类类型推断
- html - 如何防止chrome使用html css和js文件的缓存副本而不是angular 4中来自服务器的新构建数据
- sql-server - 使用 INTO Select 将一个表数据复制到另一个数据库中
- tensorflow - 如何通过张量流中的索引获取元素?
- javascript - 如何防止签名令牌用户通过浏览器开发工具访问 API 响应?
- c# - FTP 音频文件上传在 C# 中不起作用