module, import, export
module、import、export の宣言は C++20 で使用でき、/std:c++20 以降 (/std:c++latest など) では /experimental:module コンパイラ スイッチが必要です。 詳細については、「C++ のモジュールの概要」を参照してください。
module
モジュール実装ファイルの先頭に module 宣言を配置して、ファイルの内容が名前付きモジュールに属している必要があります。
module ModuleA;
export
モジュールのプライマリ インターフェイス ファイルの export module 宣言を使用します。このファイルには拡張子 .ixx が必要です。
export module ModuleA;
インターフェイス ファイルで、パブリック インターフェイスの一部を意図した名前に export 修飾子を使用します。
// ModuleA.ixx
export module ModuleA;
namespace ModuleA_NS
{
export int f();
export double d();
double internal_f(); // not exported
}
エクスポートされていない名前は、モジュールをインポートするコードからは参照できません。
//MyProgram.cpp
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.core;
import std.regex;
import ModuleB;
// 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
)
END Microsoft 固有の仕様