web-dev-qa-db-ja.com

C ++モジュール-なぜC ++ 0xから削除されたのですか?彼らは後で戻ってきますか?

私はちょうどこれを発見しました 古いC++ 0xドラフト C++ 0xのモジュールについて。

アイデアは、コンパイル中にモジュールファイルを生成する.cppファイルのみを書き込むことにより、現在の.h/.cppシステムから抜け出すことでした。このファイルは、他の.cppファイルで使用されます。

これは本当に素晴らしい機能のようです。

しかし、私の質問は:なぜ彼らはそれをC++ 0xから削除したのですか?技術的な問題が多すぎたのですか?時間不足?そして、彼らはC++の不必要なバージョンのためにそれに取り組むことを検討すると思いますか?

110
Tomaka17

State of C++ Evolution(Post San Francisco 2008) から、モジュールの提案は「Heading for a別のTR:」として分類されました。

これらのトピックは、公開される前にC++ 0xの後の別の標準を待つには重要すぎると見なされますが、次の標準に間に合うように最終化するには実験的すぎると見なされます。したがって、これらの機能はできるだけ早く技術レポートで提供されます。

モジュールの提案はまだ準備ができていなかったため、C++ 0x標準の完成を遅らせていました。実際には削除されず、ワーキングペーパーに組み込まれたことはありませんでした。

69
James McNellis

C++モジュールドラフト(C++ 17以降の技術仕様)

C/C++モジュール仕様のドラフトといくつかの更新されたリビジョンが、open-std.orgで WG21 によって公開されています。ここで最新のドキュメントのみにリンクします。

  • 草案、モジュール用C++の拡張N461(2016年10月)。
  • 4番目のリビジョンは、P0142R(2016年3月)として公開されました。
  • P0143R2(2016年3月)として公開されたモジュールの文言。
  • Clangチームは、変更の2番目のリビジョンを公開しました:P0273R1(2016年10月)。

次のブログ投稿には、標準会議の概要、特にモジュールドラフトの現在のステータスの概要が含まれています。

更新:上記にリンクしたコナ旅行レポートで説明したように、現在2つの競合する提案があります。1つはMicrosoftから、もう1つはClangからです。マイクロソフトから提案されたソリューションはマクロのエクスポートを許可しませんが、Clangチームからのソリューションはマクロのエクスポートをサポートします。これまでのところ、モジュール仕様のドラフトを正式に提出したのはマイクロソフトだけです。

マイクロソフトが提案したモジュール仕様

以下は、この提案に含まれる最も重要な概念の概要です。ドラフトとして、これはおそらく変更される可能性があります。新しいモジュール標準は、とりわけ次のもので構成されます。

モジュールを宣言するmoduleキーワードは、複数のファイルがこれを宣言して1つのモジュールをビルドできます(ただし、各モジュールに対して、1つのcompilation-unitexport {} セクション):

module M;

モジュールをインポートするためのimportキーワード。importの代わりに、using module代わりに、新しいインポートキーワードを避けることができます。

import std.io;
import module.submodule;

このモジュールの一部であるパブリック宣言、非インターフェース宣言を定義するexport構文モジュールの一部はエクスポートブロック外で定義されるため、エクスポートしないでください。 Declarationsは、C/C++のあらゆる種類の宣言、つまり、関数だけでなく、変数、構造体、テンプレート、名前空間、およびクラスでもかまいません。

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

モジュールの重要な変更点は、マクロとプリプロセッサ定義がモジュールに対してローカルになり、エクスポートされないことです。したがって、マクロはインポートされたモジュールに影響を与えません。

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

その重要な注意点は、現在のプリプロセッサシステムとモジュールの両方が共存でき、たとえばマクロを含めるためにヘッダーを使用できることです。

詳細については、ドラフトを読むことをお勧めします。

Clangモジュール

Clangは clangモジュールページ にあるモジュールの実装に取り​​組んでいます。ただし、clangは現在、モジュールの具体的な構文を実装していません。つまり、上記の構文はClangによって実装されていません。これを説明するために、ページには次のステートメントが含まれています。

現時点では、インポート宣言用のCまたはC++構文はありません。 ClangはC++委員会でモジュールの提案を追跡します。今日のモジュールのインポート方法を確認するには、「インポートとして含める」セクションを参照してください。

現在Clangによって実装されている主要な部分は、ヘッダーファイルを使用する既存のコードのモジュールマップを作成できる「モジュールマップ言語」です。

モジュールからのマクロのエクスポート

上記のように、マクロエクスポートが最終Modules TSの一部になるかどうかはまだ不明です。 P0273R1 では、マクロのエクスポート用に次の構文が提案されました。

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);
89
lanoxx

Clangは、標準化が完了する前でもモジュールの作業を開始する最初のコンパイラです。まだ多くのドキュメントはありませんが、サンプルコードは次の場所にあります。
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Douglas Gregor(それらを実装する開発者)からのコメント:
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

理論的には、begin_module、end_module、import_moduleなどのヘルパーマクロの束を定義して、将来発生する可能性のある構文の変更から保護することができます。

編集1:
Douglas Gregorは、彼の実装に関するプレゼンテーションをリリースしました。
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

編集2:
clangでのモジュールサポートは、ここに文書化されています。
http://clang.llvm.org/docs/Modules.html

編集3:
MicrosoftのC++コンパイラでもモジュールがサポートされるようになりました: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs- 2015-update-1.aspx

32
zah