2015-10-23 23 views
26

#includeの代わりにモジュールがあります。 Clang has a complete implementation for C++。今、Clangを使ってモジュールを使いたいのであれば、どうすればいいですか?ClangでC++モジュールを使用するにはどうすればよいですか?


(構文を含む)モジュールの仕様は最終的ではないようにC++ソースファイルに

import std.io; 

を使用して、動作(コンパイル)はまだありません。


-fmodulesフラグを渡すとき、の#includeは、それらの適切な輸入に書き換えされ、Clang documentation状態。しかし、そうでない場合はプリプロセッサを示唆してチェック(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このテストファイルをコンパイルします。

私は間違っていますか?

答えて

11

あなたが言及したように、打ち鳴らすにはまだ輸入のためのC++構文を持っていない、 ので、私はそれがための最良の方法ではないかもしれないので、#includeディレクティブは、ファイルの前処理時に輸入のように書き換える文字通りあることを行っていることを疑いますモジュールが意図したとおりに動作しているかどうかテストします。

ただし、-fmodules-cache-path=<path>を明示的に設定すると、ビルド中にモジュールがコンパイルされている場合、そのファイルにプリコンパイル済みのモジュールファイル(* .pcm)を挿入することができます。

私が経験したところではモジュールが有効な標準ライブラリを使用するには、libC++(バージョン3.7.0以降のmodule.modulemapが付属しているようです)を使用する必要があります完全にちょうどまだ。 (Visual Studio 2015のC++コンパイラは、11月にUpdate 1で何らかの形式のモジュールサポートを受ける予定です)

stdlibとは独立して、独自のコードでモジュールを使用することができます。 clangドキュメントにはModule Map Languageの詳細な説明が含まれていますが、 here(cmakeを使用)という少しのサンプルプロジェクトを設定しました。これは、構築時にいくつかのモジュールを含むcacheディレクトリを生成するはずです。

14

this commitの時点で、ClangはModules TSを実験的にサポートしています。

実験モジュールのサポートについては、VS blog postのように(変更が小さい)同じサンプルファイルを用意しましょう。

まず、モジュールインターフェイスファイルを定義します。デフォルトでは、Clangはcppm拡張子(およびその他のもの)を持つファイルをC++モジュールのインターフェイスファイルとして認識します。

​​

モジュールインタフェース宣言はexport module M;だけでなくmodule M; VSのブログの記事のようにする必要があることに注意してください。次のように

は、次にモジュールを消費:

// file: bar.cpp 
import M; 

int main() 
{ 
    f(5); 
    g(0.0, 1); 
    return 0; 
} 

、モジュールのインターフェース拡張は、(のはそれとして、ixxを言わせcppm以外の場合

clang++ -fmodules-ts --precompile foo.cppm -o M.pcm 

か、とモジュールfoo.cppmをプリコンパイルVSを使用している場合)、次を使用できます。

clang++ -fmodules-ts --precompile -x c++-module foo.ixx -o M.pcm 

は、その後

clang++ -fmodules-ts -fprebuilt-module-path=. bar.cpp 

または、PCMファイル名はモジュール名と同じでない場合は、あなたが使用する必要があるだろうとプログラムを構築:

clang++ -fmodules-ts -fmodule-file=M.pcm bar.cpp 

私はこれらのコマンドをテストしてみましたr303050 build(2017年5月15日)を使用しているWindows。

注: '= -fprebuiltモジュールパス。':

打ち鳴らす++ exeファイル::。警告:コンパイル中に未使用の引数-fprebuilt-module-path=.オプションを使用する場合、私は警告を受けます[-Wunused-command-line-argument]

このオプションを指定しないと、モジュールMが見つからないため、正しく表示されません。

+2

これはXcode 9でも同様に動作します。 –

関連する問題