我正在将旧代码转换为可作为 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 或字符串)
例如我有以下玩具文件:
mod.hpp
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
使用.cpp
import "mod.hpp";
int main() {
std::cout << "Hello, World!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是如果你像这样编译它cl use.cpp /std:c++latest我会得到错误
error C7612: could not find header unit for 'mod.hpp'
Run Code Online (Sandbox Code Playgroud)
如何在 MSVC 中创建/使用标头单元?
注意:我现在正在制作跨平台/跨编译器项目。这意味着我希望相同的源代码能够在 Windows 和 Linux 上的 MSVC/CLang/GCC 中进行编译。对我来说,没有必要制作 MSVC 特定的扩展名 .ixx/.cppm,这就是我在我的例子中使用 .hpp/.cpp 的原因。更重要的是,我根本不制作 .vcxproj/.sln 文件,我只考虑在 MSVC 中进行编译的低级命令行调用。
我提出这个问题只是为了与现成的解决方案分享我的答案。
我正在尝试使用 clang 中的模块,并希望将标准库包含为模块而不是包含。
目前我这样做
#include <iostream>
#include <string>
Run Code Online (Sandbox Code Playgroud)
看来您在 msvc 中应该能够导入标准库,例如
import std.core;
Run Code Online (Sandbox Code Playgroud)
然而,当使用 clang 时,这似乎没有实现,或者以另一种方式实现。
我的问题是:是否可以像微软建议的那样导入 stl-includes,或者是否可以将标准库包含映射到模块 somhow。
注意:我无法使用的原因#include <...>或者#import <...>是因为其他错误可能会导致其自身问题。所以我认为import std.core如果可能的话,获取或类似是现在要走的路。
ModernesCpp还提到了 std.core。