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);