モジュールは#includesの代替です。 ClangにはC++の完全な実装があります 。 Clangを使用してモジュールを使用したい場合、どうすればよいでしょうか?
を使用して
import std.io;
モジュールの仕様(構文を含む)は最終的なものではないため、C++ソースファイルではまだ機能しません(コンパイル)。
Clang documentation は、-fmodules
フラグ、#includesは適切なインポートに書き換えられます。ただし、そうでない場合はプリプロセッサを確認することをお勧めします(test.cppには#include <stdio.h>
および空のメイン):
$ clang++-3.5 -fmodules -E test.cpp -o test
$ grep " printf " test
extern int printf (const char *__restrict __format, ...);
さらに、このテストファイルを-fmodules
vsフラグなしでは、同じオブジェクトファイルが生成されます。
私は何を間違えていますか?
あなたが言ったように、clangにはまだインポート用のC++構文がないため、#include
ディレクティブは、ファイルを前処理するときにインポートとしてliterally書き換えられるため、モジュールが意図したとおりに動作しているかどうかをテストする最良の方法ではない可能性があります。
ただし、-fmodules-cache-path=<path>
明示的に、ビルド中にプリコンパイルされたモジュールファイル(* .pcm)をclangに取り込むことを確認できます-モジュールが含まれている場合。
すぐにモジュール対応の標準ライブラリを使用する場合は、libc ++(バージョン3.7.0の時点でmodule.modulemapに付属しているようです)を使用する必要があります-私の経験では、これはまだ完全には機能していません。 (Visual Studio 2015のC++コンパイラも、11月のUpdate 1で何らかの形式のモジュールサポートを取得する予定です)
Stdlibとは関係なく、独自のコードでモジュールを使用できます。 clangのドキュメントには Module Map Language の詳細な説明が含まれていますが、cache
ディレクトリとビルド時にいくつかのモジュール。
this commit の時点で、Clangは Modules TS を実験的にサポートしています。
VSブログ投稿 実験モジュールのサポートについてと同じサンプルファイル(小さな変更を加えて)を見てみましょう。
まず、モジュールインターフェイスファイルを定義します。デフォルトでは、Clangはcppm
拡張子のファイル(およびその他のファイル)をC++モジュールインターフェイスファイルとして認識します。
// file: foo.cppm
export module M;
export int f(int x)
{
return 2 + x;
}
export double g(double y, int z)
{
return y * z;
}
モジュールのインターフェース宣言は、VSブログ投稿のようなexport module M;
ではなく、module M;
である必要があることに注意してください。
次に、次のようにモジュールを使用します。
// file: bar.cpp
import M;
int main()
{
f(5);
g(0.0, 1);
return 0;
}
次に、モジュールfoo.cppm
をプリコンパイルします。
clang++ -fmodules-ts --precompile foo.cppm -o M.pcm
または、モジュールインターフェイス拡張がcppm
以外の場合(VSと同様にixx
としましょう)、次を使用できます。
clang++ -fmodules-ts --precompile -x c++-module foo.ixx -o M.pcm
次に、プログラムをビルドします
clang++ -fmodules-ts -c M.pcm -o M.o
clang++ -fmodules-ts -fprebuilt-module-path=. M.o bar.cpp
または、pcmファイル名がモジュール名と異なる場合は、次を使用する必要があります。
clang++ -fmodules-ts -fmodule-file=M.pcm bar.cpp
Windowsで r303050 build (2017年5月15日)を使用してこれらのコマンドをテストしました。
注:-fprebuilt-module-path=.
オプションを使用すると、警告が表示されます。
clang ++。exe:警告:コンパイル中に引数が使用されていません: '-fprebuilt-module-path =。' [-Wunused-command-line-argument]
このオプションがないと、モジュールM
が見つからないため、これは正しくないように見えます。