module
、import
、およびexport
宣言は C++20 で使用でき、コンパイラ スイッチ/std:c++20
以降が必要です。 詳細については、「C++ のモジュールの概要」を参照してください。
module
モジュール実装ファイルの先頭に module
宣言を配置して、ファイルの内容が名前付きモジュールに属している必要があります。
module ModuleA;
export
モジュールのプライマリ インターフェイス ファイルには export module
宣言を使用します。この宣言には、既定で拡張子が .ixx
されています。 別の拡張機能を使用する場合は、 /interface スイッチを使用してモジュール インターフェイスとしてコンパイルします。
export module ModuleA;
インターフェイス ファイルで、パブリック インターフェイスの一部を意図した名前に export
修飾子を使用します。
// ModuleA.ixx
export module ModuleA;
namespace ModuleA_NS
{
export int f();
export double d();
double internal_f(); // not exported
}
エクスポートされていない名前は、モジュールをインポートするコードには表示されません。
import ModuleA;
int main() {
ModuleA_NS::f(); // OK
ModuleA_NS::d(); // OK
ModuleA_NS::internal_f(); // Ill-formed: error C2065: 'internal_f': undeclared identifier
}
export
キーワードがモジュール実装ファイルに表示されない場合があります。 export
が名前空間名に適用されると、名前空間内のすべての名前がエクスポートされます。
import
import
宣言を使用して、モジュールの名前をプログラムに表示します。 import
宣言は、module
宣言の後、およびすべての #include
ディレクティブの後に、ファイル内で他のどの宣言よりも前に指定する必要があります。
module ModuleA;
#include "custom-lib.h"
import std;
import myModule;
// begin declarations here:
template <class T>
class Baz
{...};
解説
import
とmodule
の両方がキーワードとして扱われるのは、論理行の先頭に表示される場合のみです。
// OK:
module ;
module module-name
import :
import <
import "
import module-name
export module ;
export module module-name
export import :
export import <
export import "
export import module-name
// Error:
int i; module ;
Microsoft 固有の仕様
Microsoft C++ では、トークンの import
と module
は、マクロの引数として使用される場合は常に識別子であり、キーワードではありません。
例
#define foo(...) __VA_ARGS__
foo(
import // Always an identifier, never a keyword
)
Microsoft 固有の仕様はここまで