模块是#includes的替代品.Clang有一个完整的C++实现.如果我现在想使用Clang使用模块,我该怎么办?
运用
import std.io;
Run Code Online (Sandbox Code Playgroud)
在C++源文件中还没有工作(编译),因为模块的规范(包括语法)不是最终的.
该锵文件指出,经过时-fmodules标志,#包括将被改写到相应的进口.但是,检查预处理器会另外建议(test.cpp只包含#include <stdio.h>一个空的main):
$ clang++-3.5 -fmodules -E test.cpp -o test
$ grep " printf " test
extern int printf (const char *__restrict __format, ...);
Run Code Online (Sandbox Code Playgroud)
此外,使用-fmodulesvs no flags 编译此测试文件会产生相同的目标文件.
我究竟做错了什么?
我正在将旧代码转换为可作为 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 中的模块支持是部分的。我在最近发布的 LLVM 12.0 中在 Windows 64 位下使用 CLang。
我成功地设法使用了常规模块(您通过 导入import modulename;)。
但我还没有设法创建和使用头单元模块,那些你通过import "header.hpp";. 你能建议如何用例子做到这一点吗?
为了尝试标题单元,我创建了下一个玩具文件:
你好.hpp:
#include <vector>
Run Code Online (Sandbox Code Playgroud)
使用.cpp:
import "hello.hpp";
int main() {
std::vector<int> v(123);
}
Run Code Online (Sandbox Code Playgroud)
然后我成功(我希望)将头单元编译hello.hpp成 PCM 文件:
clang++ -std=c++20 -Xclang -emit-header-module -I. hello.hpp -o hello.pcm
Run Code Online (Sandbox Code Playgroud)
命令运行没有错误并产生hello.pcm. 如果您在没有-o标志的情况下运行上面的命令,hello.hpp.gch则会创建文件
。
然后我尝试编译use.cpp,但没有成功,不知何故它无法识别我的头单元和/或找不到相应的hello.pcm. 我想我错过了一些特殊的标志,这些标志表明编译器是头单元。使用了下一个命令:
clang++ -std=c++20 -fprebuilt-module-path=. -fmodule-file=hello.hpp=hello.pcm -I. use.cpp
Run Code Online (Sandbox Code Playgroud)
这给了编译错误:
use.cpp:1:8: error: header file "hello.hpp" (aka './hello.hpp') cannot be imported …Run Code Online (Sandbox Code Playgroud)