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


110

C ++ 0xのモジュールに関するこの古いC ++ 0xドラフトを発見しました。

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

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

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

回答:


70

C ++の進化(2008ポストサンフランシスコ)の状態、モジュールの提案は、次のように分類された「別々のTRの見出し:」

これらのトピックは、公開される前にC ++ 0xの後に別の標準を待つにはあまりにも重要であると考えられていますが、次の標準に間に合うように確定するにはあまりにも実験的です。したがって、これらの機能はできるだけ早くテクニカルレポートで提供されます。

モジュールの提案はまだ準備ができておらず、それを待っていただけでC ++ 0x標準の完成が遅れたでしょう。それは本当に削除されたのではなく、ワーキングペーパーに組み込まれなかっただけです。


89

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

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

  • ワーキングドラフト、モジュールC46の拡張機能N4610(2016年10月)。
  • P0142R0(2016年3月)として公開された4番目のリビジョン。
  • P0143R2として公開されたモジュールの表現(2016年3月)。
  • clangチームは、変更の2番目の改訂版P0273R1(2016年10月)を公​​開しました。

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

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

Microsoftが提案したモジュール仕様

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

moduleモジュールを宣言するためのキーワード。複数のファイルがこれを宣言して1つのモジュールを構築できます(ただし、モジュールごとに1つのコンパイル単位のみがexport {}セクションを含むことができます)。

module M;

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

import std.io;
import module.submodule;

このモジュールの一部でexportあるパブリック宣言を定義する構文、モジュールの一部としてエクスポートしてはならない非インターフェース宣言は、エクスポートブロックの外側で定義されます。宣言は、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によって実装されている主要な部分は「モジュールマップ言語」です。これにより、ヘッダーファイルを使用している既存のコードにモジュールマップを書き込むことができます。

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

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

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

2
2018 Rapperswilからの更新、Gabriel dos ReisとRichard Smithのマージされた提案、p1103r0があります。botondballo.wordpress.com/2018/06/20/…–
ドウェインロビンソン

32

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:
ダグラスグレゴールは彼の実装に関するプレゼンテーションをリリースしました: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


-39
  1. それは非常に大きな概念の変化だからです。
  2. h / cppへのソースの分離が仕事をするので、それの実際の必要はありません
  3. C ++は実際の「モジュール」ライブラリの構築方法を定義していないためです。コンパイラ開発者とリンカに任せます。
  4. 「モジュール」は、プラットフォームに依存している場合があります。たとえば、DLLは共有オブジェクトとはかなり異なります。したがって、これらの概念をマージすることはそれほど簡単ではありません。

78
確かに必要があります。.h / .cppは、途方もなく悪い、時代遅れの回避策です。モジュールシステムは大きな変化になるでしょうが、それは標準委員会が明らかに重要だと考えるものです。
2010

13
ヘッダビルドモデルは問題モジュールを解決するために意図されている、いない溶液。また、モジュールはDLL / SOの代わりにはなりません。
bames53

5
これは誤りです。1 .モジュールの提案では、既存のヘッダーシステムとの下位互換性を確保するために細心の注意を払っています。そのため、将来モジュールが導入されるときに何も問題はありません。2.ヘッダーモジュールのコンパイル時間の複雑さをO(M * N)の複雑さからO(M + N)に減らす必要性は、十分に文書化されています。3.モジュール標準は、モジュールのコンパイルおよびリンク方法を指示しませんが、モジュールのプライベートAPIとパブリックAPIを区別する明確なセマンティクスを追加します。4. DLLまたは共有オブジェクトのバイナリ形式は、標準の影響を受けません。
lanoxx

3
「h / cppへのソースの分離が機能するので、実際にそれを必要としない」ので、注入された指をチェーンソーで切断しますが、それが問題ではないという意味ではありません!.NETやその他の新しい言語を見て、実際に表示したり正しく構築したりできるように、特定の方法で物事を注文する必要があるのは、大きな負担となります。
16年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.