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
{...};
仅当 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__
import // Always an identifier, never a keyword
结束 Microsoft 专用
C++ 中的模块概述