C ++モジュールドラフト(C ++ 17以降の技術仕様)
C / C ++モジュール仕様のドラフトといくつかの更新されたリビジョンは、WG21によってopen-std.orgで公開されています。ここでは最新のドキュメントにのみリンクします。
次のブログ投稿には、標準会議の概要、特にモジュールドラフトの現在のステータスの概要が含まれています。
更新:上記でリンクしたコナ旅行レポートで説明したように、現在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);