web-dev-qa-db-ja.com

ClangでC ++モジュールを使用するにはどうすればよいですか?

モジュールは#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フラグなしでは、同じオブジェクトファイルが生成されます。

私は何を間違えていますか?

30
xjcl

あなたが言ったように、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ディレクトリとビルド時にいくつかのモジュール。

12
melak47

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が見つからないため、これは正しくないように見えます。

25
Smi