次の方法で共有


moduleimportexport

moduleimport、および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
{...};

解説

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
)

Microsoft 固有の仕様はここまで

参照

C++ のモジュールの概要
モジュールを使用して C++ 標準ライブラリをインポートする