moduleimportexport

这些moduleimportexport声明在 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++标准库