module, import, export

moduleimportexport の宣言は 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
{...};

注釈

importmodule の両方がキーワードとして扱われるのは、論理行の最初に出現する場合のみです。

// 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++ では、トークンの importmodule は、マクロの引数として使用される場合は常に識別子であり、キーワードではありません。

#define foo(...) __VA_ARGS__
foo(
import // Always an identifier, never a keyword
)

END Microsoft 固有の仕様

参照

C++ のモジュールの概要