MS Visual C++ 2015 Update 1 实现了模块提议.
以下是它的工作原理示例:
来源:
// c.ixx | // b.ixx | // a.cpp
module GM; | import GM; | import FM;
export void g() {} | module FM; | int main() { f(); }
| export void f() { g(); } |
Run Code Online (Sandbox Code Playgroud)
构建命令:
set CL=/EHsc /experimental:module # Default flags for cl.exe
cl.exe /c c.ixx # Produces c.obj, GM.ifc
cl.exe /c b.ixx # Depends on GM.ifc, produces b.obj, FM.ifc
cl.exe /c a.cpp # Depends on FM.ifc, …Run Code Online (Sandbox Code Playgroud) 我如何在Clang中使用C++模块中给出的基本示例?适合我,但不导入标准库(例如via import std.stdio;); 在浏览了http://clang.llvm.org/docs/Modules.html之后,目前尚不清楚如何在C++模块中使用标准库,例如:
// foo.cppm:
export module foo;
// works: #include <stdio.h>
// none of these work:
import std.stdio;
import std.io;
import std;
export void test_foo(){
printf("hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
clang++ -std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm
foo.cppm:4:8: fatal error: module 'std.stdio' not found
注意:
clang++ --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.4.0
我在OSX上.我也试过brew install llvm的clang也没用.
制作这样的作品最简单的方法是什么?
我在cppdepend网站上看到了以下一小段代码.
import std; // Module import directive.
int main()
{
std::cout<<"Hello World\n";
}
Run Code Online (Sandbox Code Playgroud)
那么,import std;C++ 的目的是什么?如何使用import std;而不是using namespace std;在C++中?
我试图在G ++编译器中编译程序,但是我收到了一个错误.
我正在尝试使用 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。
我正在尝试将 C++ 模块 TS 与 clang 一起使用。
我创建了两个文件:
// foo.cppm
export module foo;
export void test() {
}
Run Code Online (Sandbox Code Playgroud)
和
// bar.cpp
import foo;
int main() {
test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我foo.cppm用这个命令编译
clang++ --std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm
Run Code Online (Sandbox Code Playgroud)
它编译没有错误并创建一个foo.pcm文件,但是当我尝试使用此命令编译二进制文件时:
clang++ --std=c++17 -fmodules-ts -fprebuilt-module-path=. -fmodule-file=foo.pcm bar.cpp
Run Code Online (Sandbox Code Playgroud)
它打印一个错误:
/tmp/bar-f69a1f.o: In function `main':
bar.cpp:(.text+0x10): undefined reference to `test()'
Run Code Online (Sandbox Code Playgroud)
我用 clang 7 trunk 和 clang 6 尝试过。我也尝试了不同的std选项和这个命令:
clang++ --std=c++17 -fmodules-ts -fmodule-file=foo.pcm bar.cpp -o bar
Run Code Online (Sandbox Code Playgroud)
没有任何帮助。
有趣的是,如果一个模块使用其他模块的符号,clang 会编译这些模块。所以据我所知,问题是在链接阶段。
有什么问题?