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
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по