Las*_*öld 6 c++ clang++ c++-modules
我正在将旧代码转换为可作为 c++ 模块导入的代码。问题是我希望它仍然可以工作并且可以轻松维护为旧的标头/源版本。我该怎么做(如果可能)。
是否可以创建一个导出标题内容的模块?(任何其他可以让您维护旧的 .cpp/.h 文件和模块文件的解决方案也被接受)
玩具示例:
// In vector.h
template <typename T>
struct Vector {
T x, y;
}
// In .cppm
export module vector;
// #include "vector.h"
// Export struct/class Vector from header
Run Code Online (Sandbox Code Playgroud)
我尝试过的只是export Vector不同的版本,有和没有模板等。
额外问题:您可以为 std lib 执行此操作吗?(例如 iostream 或字符串)
a)您希望保持代码(大部分)原样,但将其包装在模块内。
这将产生类似于 PCH 的结果,但在语言级别上进行了标准化。在不需要更改代码的假设下,这具有以下优点:
实现此目的最简单的方法是将所有公共标头放入一个模块中:
// your_lib.cppm
module;
// global module fragment here
#include "your_header1.hpp"
#include "your_header2.hpp"
// ...
export module your_lib;
Run Code Online (Sandbox Code Playgroud)
您应该阅读有关可导入标头的信息(语法已在注释中显示,例如import <iostream>)。据我所知,什么是可导入标头是实现定义的。所以一般来说,您不必使用全局模块片段。
b) 您想要模块化您的代码库,但允许其他人仍然使用头文件。
想要这样的东西的唯一原因(这是一个很好的理由)是支持仍然使用旧版 C++20 标准的用户使用您的库。
您所希望的解决方案实际上是不可能的。对不起。从模块到头没有办法返回。图书馆内部的所有内容都可以完全模块化。然后你必须做出决定。将公共接口保留为标头,或者也将其模块化。在第一种情况下,请参阅 a) 了解如何在内部模块中使用自己的公共标头。在第二种情况下,您必须以头文件的形式提供接口的第二种实现。正如我所说,您只选择 b) 来支持旧的标准版本。因此,您还必须确保不在您的(基于标头的)公共接口中使用任何 C++20 功能。