112

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

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

これは非常に優れた機能のように見えます。

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

4

4 に答える 4

91

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

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

  • ワーキング ドラフト、モジュール用 C++ の拡張N4610 (2016 年 10 月)。
  • P0142R0として発行された第 4 リビジョン(2016 年 3 月)。
  • P0143R2 (2016 年 3 月)として発行されたモジュールの文言。
  • clang チームは、変更点の 2 番目のリビジョンであるP0273R1 (2016 年 10 月) を公開しました。

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

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

Microsoft が提案するモジュール仕様

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

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

module M;

import代わりにモジュールをインポートするためのキーワードを代わりimportに使用することも決定される可能性があるusing moduleため、新しいインポート キーワードを避けることができます。

import std.io;
import module.submodule;

exportこのモジュールの一部である public宣言を定義する構文、モジュールの一部としてエクスポートされるべきではない非インターフェイス宣言は、エクスポート ブロックの外で定義されます。宣言は、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);
于 2014-09-02T10:47:18.900 に答える
71

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

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

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

于 2010-08-29T19:07:38.483 に答える
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 などの一連のヘルパー マクロを定義して、将来発生する可能性のある構文の変更から身を守ることができます。

EDIT 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

于 2012-03-03T16:28:18.220 に答える
-42
  1. それは非常に大きな概念変更だからです。
  2. h/cpp へのソースの分離が仕事をするので、それの本当の必要性はありません
  3. C++ は、実際の「モジュール」ライブラリがどのように構築されるかを定義していないためです。コンパイラ開発者とリンカに任せます。
  4. 「モジュール」は、プラットフォームに大きく依存する場合があります。たとえば、DLL は共有オブジェクトとはまったく異なります。したがって、これらの概念を融合することはそれほど簡単ではありません。
于 2010-08-29T19:10:50.193 に答える