module import export 声明在 C++20 中可用,并且需要 /experimental:module 编译器开关和 /std:c++20 或更高版本(例如 /std:c++latest )。 有关详细信息,请参阅 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__
import // Always an identifier, never a keyword

结束 Microsoft 专用

C++ 中的模块概述