这些module、import和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
{...};
备注
仅当 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__
foo(
import // Always an identifier, never a keyword
)
结束 Microsoft 专用