Поделиться через


module, import, export

Объявления moduleи export объявления доступны в C++20 и требуют переключения компилятора /experimental:module вместе с /std:c++20 или более поздней версией (например/std:c++latest). import Дополнительные сведения см. в разделе "Общие сведения о модулях в 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 C++маркеры import и всегда являются идентификаторами и module никогда не ключевое слово, когда они используются в качестве аргументов макроса.

Пример

#define foo(...) __VA_ARGS__
foo(
import // Always an identifier, never a keyword
)

End Microsoft Specific

См. также

Обзор модулей в C++