Перейти к содержимому

Как подключить модуль в с

  • автор:

Как подключить модуль в с

В зависимости от выбранного варианта связи с модулем (экспортируемые функции или COM), информация об этом должна быть задана с помощью следующих тегов:

Тег Значение
clsid CLSID объекта. Модуль представляет собой COM-объект (ActiveX object) или элемент ActiveX (ActiveX control)
progid ProgID объекта. Модуль представляет собой COM-объект или элемент ActiveX
module Путь к библиотеке (.dll файлу). Интерфейс с модулем предоставляется через экспортируемые функции.

При запуске модуля ZuluGIS проверяет наличие одного из перечисленных выше тегов в последовательности, указанной в таблице. В случае наличия тегов clsid или progid , ZuluGIS проверяет, является ли объект элементом ActiveX (ActiveX control), если нет, то он рассматривается как COM-объект поддерживающий OLE Automation.

Далее загрузка и подключение модуля происходит по одному из трех сценариев:

Подключение модуля в виде простой DLL

Ниже представлен фрагмент манифеста модуля в виде простой DLL:

 id="myplugin" name="My Plugin"> MyPlugin.dll .

Порядок загрузки модуля:

  1. Загружается библиотека, указанная в теге module с помощью функции LoadLibrary Win32 API.
  2. Получение адреса функции подключения модуля. По умолчанию такой функцией является:
extern ”C” BOOL __declspec(dllexport) __stdcall ConnectZuluPlugin(IPluginConnector *pConn, LPDWORD lpdwCookie);

Для получения адреса используется декорированное (mangled) имя этой функции, которое при компиляции модуля в Microsoft Visual C++ будет иметь вид _ConnectZuluPlugin@8. В случае использование функции с другим именем или если декорация (mangling) имен отличается от MSVC (например, Borland Delphi или Borland C++Builder), имя функции с помощью тега connectmethod :

 id="myplugin" name="My Plugin"> MyPlugin.dll  name="MyConnectMethod"/> .

Подключение модуля в виде COM-объекта

Ниже представлен пример регистрации модуля в виде COM-объекта:

 id="myplugin" name="My Plugin"> MyPlugin.MyPluginObject .
 id="myplugin" name="My Plugin"> .

Порядок загрузки модуля:

  1. Создание экземпляра объекта посредством вызова функции CoCreateInstance Win32 API. Объект задается либо с помощью тегом progid , либо clsid , как удобней разработчику. При создании объекта, ZuluGIS запрашивает у него интерфейс IDispatch, поэтому объект должен либо поддерживать непосредственно интерфейс IDispatch, либо дуальный интерфейс, порожденный от IDispatch.
  2. Вызов метода подключения. По умолчанию этот метод имеет следующий вид:
IDL: [id(dispid)] HRESULT ConnectZuluPlugin([in] IDispatch *pConn,[out,retval] VARIANT_BOOL *pRetVal);
'Visual Basic: Public Function ConnectZuluPlugin(Connector As IPluginConnector) As Boolean 

Если для подключения предполагается использовать другое имя метода, то это имя можно указать с помощью элемента connectmethod :

 id="myplugin" name="My Plugin">  name="MyConnectMethod"/>

Подключение модуля в виде элемента ActiveX

Модуль в виде элемента ActiveX задается в манифесте также как и COM-модуль с помощью элемента progid или clsid . Для того, чтобы система знала что указанный объект — элемент ActiveX, необходимо добавить атрибут control :

 id="myplugin" name="My Plugin">  control="1">MyPlugin.MyPluginObject .
 id="myplugin" name="My Plugin">  control="1"> .

ZuluGIS загружает модуль в следующем порядке:

  1. Создается панель, куда внедряется экземпляр указанного элемента ActiveX по указанному ProgID или CLSID;
  2. Вызывается метод подключения. Формат метода подключения аналогичен подключению обычного COM-объекта.

Панель, в которую внедряется элемент ActiveX по-умолчанию отображается плавающей, способной «схлопываться» и «докироваться» как и другие рабочие окна ZuluGIS, а при закрытии вызывает выгрузку плагина, если не задано иное поведение.

Поведение панели можно задать в манифесте с помощью элемента controlbar (см. «Управление окном модуля»)

Метод подключения модуля

Вызов метода подключения предоставляет возможность произвести инициализацию загруженного модуля и проанализировать возможность его дальнейшей работы.

В случае, когда метод подключения модуля возвращает значение FALSE, подключение модуля прерывается и модуль выгружается из памяти. В случае, если загрузка модуля вызвана выполнением команды, предоставляемой данным модулем, выполнение указанной команды прерывается с возвратом в систему результата FALSE.

Первым параметром методу подключения передается объект IPluginConnector object, который является посредником между ZuluGIS и модулем. Свойство Zulu property (IPluginConnector) этого объекта дает доступ к корневому объекту объектной модели системы.

Обычно объект IPluginConnector сохраняется во внутренней переменной для дальнейшего использования. Однако, когда модуль выгружается, при выполнении метода отсоединения модуля этот объект должен быть высвобожден.

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

C++20 представляет модули, современное решение, которое превращает библиотеки и программы C++ в компоненты. Модуль — это набор файлов исходного кода, скомпилированных независимо от исходных файлов (или более точно, единиц перевода, импортируемых ими). Модули устраняют или сокращают многие проблемы, связанные с использованием файлов заголовков. Они часто сокращают время компиляции. Макросы, директивы препроцессора и неэкспортированные имена, объявленные в модуле, не отображаются за пределами модуля. Они не влияют на компиляцию единицы перевода, импортируемой модулем. Модули можно импортировать в любом порядке без проблем с переопределениями макросов. Объявления в импортируемом модуле перевода не участвуют в разрешении перегрузки или поиске имен в импортированном модуле. После компиляции модуля результаты хранятся в двоичном файле, который описывает все экспортированные типы, функции и шаблоны. Компилятор может обрабатывать этот файл гораздо быстрее, чем файл заголовка. И компилятор может повторно использовать его везде, где модуль импортируется в проект.

Модули можно использовать параллельно с файлами заголовков. Исходный файл C++ может использовать import модули и #include файлы заголовков. В некоторых случаях можно импортировать файл заголовка в виде модуля, который быстрее, чем используется #include для обработки с помощью препроцессора. Рекомендуется использовать модули в новых проектах, а не файлы заголовков как можно больше. Для более крупных существующих проектов при активной разработке поэкспериментируйте с преобразованием устаревших заголовков в модули. На основе внедрения зависит от того, получается ли существенное сокращение времени компиляции.

Чтобы контрастировать модули с другими способами импорта стандартной библиотеки, см. раздел «Сравнение единиц заголовков», модулей и предварительно скомпилированных заголовков.

Включение модулей в компиляторе Microsoft C++

Начиная с Visual Studio 2022 версии 17.1, стандартные модули C++20 полностью реализованы в компиляторе Microsoft C++.

Прежде чем он был указан стандартом C++20, корпорация Майкрософт поддерживала экспериментальную поддержку модулей. Компилятор также поддерживает импорт предварительно созданных модулей стандартной библиотеки, описанных ниже.

Начиная с Visual Studio 2022 версии 17.5 импорт стандартной библиотеки в качестве модуля является стандартизованным и полностью реализован в компиляторе Microsoft C++. В этом разделе описывается старый экспериментальный метод, который по-прежнему поддерживается. Сведения о новом стандартизованном способе импорта стандартной библиотеки с помощью модулей см. в статье «Импорт стандартной библиотеки C++ с помощью модулей».

Вы можете использовать функцию модулей для создания модулей с одним разделом и импорта модулей стандартной библиотеки, предоставляемых корпорацией Майкрософт. Чтобы включить поддержку модулей стандартной библиотеки, выполните компиляцию и /experimental:module /std:c++latest . В проекте Visual Studio щелкните правой кнопкой мыши узел проекта в Обозреватель решений и выберите «Свойства«. Установите раскрывающийся список «Конфигурация» на все конфигурации, а затем выберите «Свойства> конфигурации C/C++>Language>Enable C++ Modules (экспериментальные)».

Модуль и код, который использует его, необходимо скомпилировать с теми же параметрами компилятора.

Использование стандартной библиотеки C++ в качестве модулей (экспериментальных)

В этом разделе описывается экспериментальная реализация, которая по-прежнему поддерживается. Новый стандартизованный способ использования стандартной библиотеки C++ в качестве модулей описывается в статье Импорт стандартной библиотеки C++ с помощью модулей.

Импортируя стандартную библиотеку C++ в виде модулей, а не включив ее в файлы заголовков, вы можете ускорить компиляцию в зависимости от размера проекта. Экспериментальная библиотека разделена на следующие именованные модули:

  • std.regex предоставляет содержимое заголовка
  • std.filesystem предоставляет содержимое заголовка
  • std.memory предоставляет содержимое заголовка
  • std.threading предоставляет содержимое заголовков , , , , и
  • std.core предоставляет все остальное в стандартной библиотеке C++

Чтобы использовать эти модули, добавьте объявление импорта в начало файла исходного кода. Например:

import std.core; import std.regex; 

Чтобы использовать модули стандартной библиотеки Майкрософт, скомпилируйте программу с /EHsc помощью параметров и /MD параметров.

Пример

В следующем примере показано простое определение модуля в исходном файле Example.ixx . Расширение .ixx требуется для файлов интерфейса модуля в Visual Studio. В этом примере файл интерфейса содержит определение функции и объявление. Однако вы также можете поместить определения в один или несколько отдельных файлов реализации модуля, как показано в следующем примере. Инструкция export module Example; указывает, что этот файл является основным интерфейсом для вызываемого Example модуля. Модификатор export f() указывает, что эта функция отображается при Example импорте другой программой или модулем. Модуль ссылается на пространство Example_NS имен.

// Example.ixx export module Example; #define ANSWER 42 namespace Example_NS < int f_internal() < return ANSWER; >export int f() < return f_internal(); >> 

Файл MyProgram.cpp использует import объявление для доступа к имени, экспортируемого Example . Имя Example_NS отображается здесь, но не все его члены. Кроме того, макрос ANSWER не отображается.

// MyProgram.cpp import Example; import std.core; using namespace std; int main() < cout 

Объявление import может отображаться только в глобальных область.

Грамматика модуля

module-name :
module-name-qualifier-seq необ. identifier

module-name-qualifier-seq :
identifier .
module-name-qualifier-seq identifier .

module-partition :
: module-name

module-declaration :
export opt module module-name module-partition opt attribute-specifier-seq opt ;

module-import-declaration :
export opt import module-name attribute-specifier-seq opt ;
export opt import module-partition attribute-specifier-seq opt ;
export opt import header-name attribute-specifier-seq opt ;

Реализация модулей

Интерфейс модуля экспортирует имя модуля и все пространства имен, типы, функции и т. д., составляющие общедоступный интерфейс модуля. Реализация модуля определяет вещи, экспортированные модулем. В самой простой форме модуль может состоять из одного файла, который объединяет интерфейс модуля и реализацию. Вы также можете поместить реализации в один или несколько отдельных файлов реализации модуля, как .h и .cpp файлы.

Для более крупных модулей можно разделить части модуля на подмодулы, называемые секциями. Каждая секция состоит из файла интерфейса модуля, который экспортирует имя секции модуля. У секции также может быть один или несколько файлов реализации секций. Модуль в целом имеет один основной интерфейс модуля, общедоступный интерфейс модуля, который также может импортировать и экспортировать интерфейсы секционирования.

Модуль состоит из одного или нескольких единиц модуля. Модуль — это единица перевода (исходный файл), содержащая объявление модуля. Существует несколько типов единиц модуля:

  • Модуль интерфейса модуля — это единица модуля, которая экспортирует имя модуля или имя секции модуля. Модуль интерфейса модуля содержит export module в своем объявлении модуля.
  • Единица реализации модуля — это модуль, который не экспортирует имя модуля или имя секции модуля. Как подразумевает имя, он используется для реализации модуля.
  • Основной блок интерфейса модуля — это единица интерфейса модуля, которая экспортирует имя модуля. В модуле должен быть один и только один основной модуль интерфейса модуля.
  • Единица интерфейса секционирования модуля — это единица интерфейса модуля, которая экспортирует имя секции модуля.
  • Единица реализации секции модуля — это единица реализации модуля с именем секции модуля в объявлении модуля, но не export ключевое слово.

Ключевое слово export используется только в файлах интерфейса. Файл реализации может быть import другим модулем, но не export может содержать имена. Файлы реализации могут иметь любое расширение.

Модули, пространства имен и поиск, зависящие от аргументов

Правила для пространств имен в модулях совпадают с другими правилами кода. Если объявление в пространстве имен экспортируется, вложенный пространство имен (за исключением неэкспортированных элементов) также экспортируется неявно. Если пространство имен экспортируется явным образом, экспортируются все объявления в определении пространства имен.

При поиске разрешения перегрузки в модуле импорта компилятор рассматривает функции, объявленные в той же единице перевода (включая интерфейсы модулей), где определены тип аргументов функции.

Секции модулей

Раздел модуля аналогичен модулю, за исключением того, что он разделяет владение всеми объявлениями во всем модуле. Все имена, экспортированные файлами интерфейса секционирования, импортируются и повторно экспортируются файлом первичного интерфейса. Имя раздела должно начинаться с имени модуля, за которым следует двоеточие. Объявления в любом из разделов отображаются во всем модуле. Для предотвращения ошибок с одним определением (ODR) не требуются специальные меры предосторожности. Можно объявить имя (функция, класс и т. д.) в одной секции и определить его в другом. Файл реализации секции начинается следующим образом:

module Example:part1; 

Файл интерфейса секции начинается следующим образом:

export module Example:part1; 

Чтобы получить доступ к объявлениям в другой секции, раздел должен импортировать его, но он может использовать только имя секции, а не имя модуля:

module Example:part2; import :part1; 

Блок первичного интерфейса должен импортировать и повторно экспортировать все файлы секции интерфейса модуля, как показано ниже.

export import :part1; export import :part2; . 

Основной блок интерфейса может импортировать файлы реализации секций, но не может экспортировать их. Эти файлы не разрешены для экспорта имен. Это ограничение позволяет модулю хранить сведения о реализации внутри модуля.

Модули и файлы заголовков

Файлы заголовков можно включить в исходный файл модуля, поместив директиву #include перед объявлением модуля. Эти файлы считаются в глобальном фрагменте модуля. Модуль может видеть только имена в глобальном фрагменте модуля, которые находятся в заголовках, которые он явно включает. Глобальный фрагмент модуля содержит только символы, используемые.

// MyModuleA.cpp #include "customlib.h" #include "anotherlib.h" import std.core; import MyModuleB; //. rest of file 

Для управления импортом модулей можно использовать традиционный файл заголовка:

// MyProgram.h import std.core; #ifdef DEBUG_LOGGING import std.filesystem; #endif 

Импортированные файлы заголовков

Некоторые заголовки достаточно автономны, что их можно использовать с помощью import ключевое слово. Основное различие между импортированным заголовком и импортированным модулем заключается в том, что все определения препроцессора в заголовке отображаются в программе импорта сразу после инструкции import .

import ; import "myheader.h"; 

Как подключить модуль в с

Человечки, Всех с Рождеством Христовым!!

А теперь у меня вопросик: как работать с модулями? Я знаю, что пишутся они как обычные программки, только без главной ф-ции, а потом в другой программке пишем в инклудах в кавычках. Но что-то у меня компилятор показывает ошибку

Unable to open include file 'MASS.CPP'

на вот мой инклудик модуля

#include"MASS.cpp"

Что я неправильно делаю? Или какой-то пунктик выполнения забыла?
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
cpp не инклудятся, а ложатся рядом
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
Сообщение от elka

Человечки, Всех с Рождеством Христовым!!

А теперь у меня вопросик: как работать с модулями? Я знаю, что пишутся они как обычные программки, только без главной ф-ции, а потом в другой программке пишем в инклудах в кавычках. Но что-то у меня компилятор показывает ошибку на вот мой инклудик модуля
Что я неправильно делаю? Или какой-то пунктик выполнения забыла?

в C++ модулей как таковых нет и так как Вы делаете делать не надо, нужно писать отдельный файл, так называемый хидер(заголовочник), в котором опишите функции, какие есть в .cpp и уже этот заголовочник подключать в .cpp, который использует ф-ции того .cpp, чьи функции описывает заголовочник.

int cool_func(int a, int b); int mega_func(int a, int b, int c);

cool_lib.cpp

#include "cool_lib.h" int cool_func(int a, int b) < return a + b; >int mega_func(int a, int b, int c)
#include "cool_lib.h" int main()

компилировать следующим образом:

cl main.cpp cool_lib.cpp

вместо cl Ваш компилятор ) Если IDE используете какую-то, то просто в проект добавьте .cpp файл
Пользователь
Регистрация: 05.01.2010
Сообщений: 42
А можно понятнее написать? Почему не правильно?
Пусть есть файл MASS.CPP, в котором

#include #include #include class element < private: int n; int *a; public: element(); void vvod_1(); void vvod_2(); void vvod_3(); void vivod(); ~element() < delete[]a; printf("\n\n rabotal destructor"); >>; element::element() < a=new int[n+1]; printf("\n rabotal konstructor 1"); >void element::vvod_1() < int i; printf("\n vvedite kol-vo elementov massiva: "); scanf("%d",&n); for (i=0;ivoid element::vvod_2() < int i; printf("\n vvedite kol-vo elementov massiva: "); scanf("%d",&n); for (i=0;i> void element::vvod_3() < FILE *f1; int i,t=0,kol=0,l; printf("\n vvedite kol-vo elementov massiva: "); scanf("%d",&n); f1=fopen("C:\\BORLANDC\\BIN\\massiv.txt","r"); while (!feof(f1)) < fscanf(f1,"%d",(a+kol)); kol++; >fclose(f1); //printf("\n kol-vo=%5d ",kol); f1=fopen("massiv.txt","r"); while (!feof(f1)) < //for(i=0;ifclose(f1); > void element::vivod()

а потом есть ругой файл KNOPKA.CPP, в котором
#include
#include
#include
#include
#include
#include

#include"MASS.cpp"
и далее всякие бла-бла-бла, которые неапознаются

Последний раз редактировалось Stilet; 09.01.2010 в 12:30 .
Форумчанин
Регистрация: 06.08.2009
Сообщений: 136

#include #include #include #include #include #include #include"MASS.h"

и надо создать MASS.h
в котором описываешь прототипы функций используемых в файле MASS.cpp
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409

Что неправильно??

нужно описание класса положить в хидер, а его реализацию в спп

#pragma once class element < private: int n; int *a; public: element(); void vvod_1(); void vvod_2(); void vvod_3(); void vivod(); ~element(); >;
. #include "MASS.H" element::~element() < delete[]a; printf("\n\n rabotal destructor"); >element::element() < a=new int[n+1]; printf("\n rabotal konstructor 1"); >void element::vvod_1() < int i; printf("\n vvedite kol-vo elementov massiva: "); scanf("%d",&n); for (i=0;ivoid element::vvod_2() < int i; printf("\n vvedite kol-vo elementov massiva: "); scanf("%d",&n); for (i=0;i> void element::vvod_3() < FILE *f1; int i,t=0,kol=0,l; printf("\n vvedite kol-vo elementov massiva: "); scanf("%d",&n); f1=fopen("C:\\BORLANDC\\BIN\\massiv .txt","r"); while (!feof(f1)) < fscanf(f1,"%d",(a+kol)); kol++; >fclose(f1); //printf("\n kol-vo=%5d ",kol); f1=fopen("massiv.txt","r"); while (!feof(f1)) < //for(i=0;ifclose(f1); > void element::vivod()

а вот потом в KNOPKA.CPP нужно сделать так

#include "MASS.H"

Пользователь
Регистрация: 05.01.2010
Сообщений: 42

Спасибочки всем за отзывчивость, но надо быть проще !! Просто надо было поместить эти файлики, которые потом стали инклудиками в папочку инклудиков в си)) И у меня все вышло и с буквочками cpp после точечки))

Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
Сообщение от elka

Спасибочки всем за отзывчивость, но надо быть проще !! Просто надо было поместить эти файлики, которые потом стали инклудиками в папочку инклудиков в си)) И у меня все вышло и с буквочками cpp после точечки))

Оно то вышло, но потом могут быть с этим проблемы ) Например, если у вас несколько .cpp файлов будут использовать этот класс и Вы в оба включите файл класса как #include "Mass.cpp", то, при компиляции, компоновщик выдаст ошибку о множественном определении методов классов. Делайте правильно(так как Вам описали) и, помимо избежания вот таких вот проблем, возможно это сыграет некую роль в оценке Вашей работы преподавателем ) Более того, добавлять всё в папку с инклудами си ещё более не верный шаг, все файлы должны быть в папке с проектом.

Использование модулей C++ в Visual Studio 2017

Команда Visual C++ рада сообщить, что в Visual Studio 2017 было существенно улучшено качество реализации модулей C++ согласно технической спецификации; также мы добавили возможность подключать Стандартную Библиотеку C++ через интерфейсы модулей. Эти интерфейсы, как и поддержка модулей компилятором, являются экспериментальной разработкой и будут развиваться в соответствии с процессом стандартизации.

Начало работы

Поддержка модулей Стандартной Библиотеки реализована в Visual Studio начиная с версии 2017 RTM. Эта функция на данный момент является опциональной и по умолчанию отключена. В будущих версиях модули будут устанавливаться автоматически вместе с заголовками Стандартной Библиотеки. Вам нужно лишь выбрать эту опцию при установке или обновлении поддержки C++.

Picture 5

Если вы уже установили VS 2017, но не устанавливали модули, это легко исправить. Просто запустите установщик еще раз и выберите соответствующие компоненты.

Picture 23

Проверка правильности установки

Чтобы проверить, настроена ли ваша копия VS 2017 для поддержки модулей, скомпилируйте и запустите приведенную ниже программу (назовите ее, например, test-vs2017-slm.cxx) из командной строки разработчика. Поскольку модули на данный момент являются экспериментальной функцией, их поддержка пока еще очень слабо реализована в среде VS.

import std.core; int main() < using namespace std; vectorv < "Plato", "Descartes", "Bacon" >; copy(v.begin(), v.end(), ostream_iterator(cout, "\n")); > 

При компиляции этого кода с командой

cl /experimental:module /EHsc /MD /std:c++latest test-vs2017-slm.cxx

на выходе должен получиться исполняемый файл (test-vs2017-slm.exe), который при запуске распечатает слова «Plato», «Descartes» и «Bacon» — каждое отдельной строкой.

Ключ компилятора для подключения модулей Стандартной Библиотеки

Необходимо добавить ключ /MD при компиляции исходного файла, чтобы подключить модули Стандартной Библиотеки. Ключ /MD инициализирует динамическую библиотеку времени выполнения C (CRT). В режиме отладки следует использовать ключ /MDd.

Если вы забыли указать ключ /MD (или /MDd в режиме отладки), линковщик выдаст ряд предупреждений и ошибку линковки LNK2019, говорящую о наличии неразрешенных внешних символов.

Никаких других ключей для использования модулей Стандартной Библиотеки не требуется. Эти модули могут применяться только для использования с библиотеками импорта DLL Универсальной библиотеки CRT (UCRT).

Подключение модулей Стандартной Библиотеки из среды разработки VS

Если вы хотите использовать среду разработки вместо командной строки, настройте ваш проект для использования экспериментальных модулей согласно следующей инструкции.

1. Откройте окно «Свойства» (Properties) проекта:

Picture 10

2. Перейдите в раздел «Свойства конфигурации» (Configuration Properties) -> C/C++ -> «Генерация кода» (Code Generation) и убедитесь, что у вас выбрана библиотека Multithreaded Debug DLL или Multithreaded DLL (для режимов отладки и релиза соответственно). Эти библиотеки выбраны по умолчанию для новых проектов, так что, если вы ничего не меняли, никаких проблем возникнуть не должно.

Picture 22

3. Зайдите в раздел «Свойства конфигурации» (Configuration Properties) -> C/C++ -> «Язык» (Language) и убедитесь, что включена поддержка стандарта C++17. Если это не так, выберите из выпадающего списка стандарт C++17 или последний проект стандарта C++ (C++ Latest Draft Standard) для конфигураций, которые вы планируете использовать.

Picture 15

4. Впишите команду /experimental:module /module:stdIfcDir "$(VCToolsInstallDir_150)ifc\$(PlatformTarget)" в разделе «Свойства конфигурации» (Configuration Properties) -> C/C++ -> «Командная строка» (Command Line), чтобы включить поддержку модулей для текущего проекта. Обратите внимание, что данный шаг будет упразднен в будущих версиях VS 2017: среда будет сама указывать расположение файлов модулей (задается параметром /module:stdIfcDir) при включении опции поддержки модулей C++.

Picture 17

После этих действий сборка и запуск тестовой программы должны пройти успешно — программа распечатает имена трех философов.

Picture 20

Изменение синтаксиса экспорта модулей

На съезде комитета по стандартизации C++ в ноябре 2016 года было принято решение об изменении синтаксиса экспорта модулей (см. Проблема модулей N1).

export module Bank;
export import Bank;

Настоящая версия Visual C++ учитывает это изменение, но также позволяет использовать и старый синтаксис, предупреждая о переходе к устаревшему варианту. Комитет по C++ рассматривает возможность присвоения старому синтаксису нового значения, несовместимого с прежним. Мы призываем вас использовать новый синтаксис; поддержка старого синтаксиса будет прекращена в целях соответствия проекту технической спецификации по модулям согласно поправкам комитета ISO C++.

Модули Стандартной Библиотеки (экспериментальная функция)

Ключевым нововведением в версии VS2017 RTM стала поддержка подключения Стандартной Библиотеки C++ посредством модулей. Это экспериментальный инструмент, описанный в предложении по C++ о Модулях Стандартной Библиотеки. В текущей версии модули организованы следующим образом:

  • std.regex предоставляет доступ к содержимому заголовка
  • std.filesystem предоставляет доступ к содержимому заголовка
  • std.memory предоставляет доступ к содержимому заголовка
  • std.threading предоставляет доступ к содержимому заголовков , , , , ,
  • std.core предоставляет доступ к прочему содержимому Стандартной Библиотеки C++

Если вы хотите использовать модули для включения заголовков не из Стандартной Библиотеки, сгенерировать модули Стандартной Библиотеки можно с помощью ключей /module:name (см. исходную заметку по модулям C++) и /module:export. Если ваш проект зависит от других библиотек и вы хотите попробовать собрать код совсем без заголовков, упаковать заголовки из таких библиотек можно тем же самым способом.

Новые версии VS будут в большей степени соответствовать предложению по модулям Стандартной Библиотеки.

Призыв к действию

Скачайте Visual Studio 2017 и опробуйте модули со своими C++-проектами и программами. Для начала можно просто заменить в исходных файлах все команды #include стандартных заголовков для контейнеров и алгоритмов на import std.core и добавить ключи компиляции /experimental:module и /MD или /MDd (в режиме отладки) к определению сборки. О результатах сообщайте нам.

В заключение

Как всегда, мы будем рады вашим отзывам. Свои комментарии присылайте по адресу visualcpp@microsoft.com либо оставляйте в Twitter @visualc или на странице Facebook Microsoft Visual Cpp.

О прочих проблемах, связанных с использованием среды MSVC в VS 2017, можно сообщить с помощью функции Сообщить о проблеме (Report a Problem) из установщика или из самой среды Visual Studio. Свои предложения оставляйте на сайте UserVoice. Спасибо!

  • Блог компании PVS-Studio
  • C++
  • Visual Studio
  • Разработка под Windows

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *