Пошаговое руководство. Добавление функций в пользовательский редактор
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
После создания пользовательского редактора вы можете добавить в него дополнительные возможности.
Создание редактора для VSPackage
- Создайте пользовательский редактор с помощью шаблона проекта пакета Visual Studio. Дополнительные сведения см. в пошаговом руководстве. Создание пользовательского редактора.
- Определите, поддерживает ли редактор одно представление или несколько представлений. Редактор, поддерживающий команду New Window или имеющий представление формы и представление кода, требует отдельных объектов данных документа и объектов представления документов. В редакторе, поддерживающем только одно представление, объект данных документа и объект представления документов можно реализовать в одном объекте. Пример нескольких представлений см. в разделе «Поддержка нескольких представлений документов».
- Реализуйте фабрику редакторов IVsEditorFactory , настроив интерфейс. Дополнительные сведения см. в разделе «Фабрики редактора».
- Определите, следует ли использовать активацию на месте или упрощенное внедрение для управления окном объекта представления документов. Упрощенное окно редактора внедрения содержит стандартное представление документов, а в окне редактора активации на месте размещается элемент activeX или другой активный объект в качестве представления документа. Дополнительные сведения см. в разделе «Упрощенное внедрение » и активация на месте.
- IOleCommandTarget Реализуйте интерфейс для обработки команд.
- Предоставьте сохраняемость документа и ответ на изменения внешнего файла:
- Чтобы сохранить файл, реализуйте и IPersistFileFormat в IVsPersistDocData2 объекте данных документа редактора.
- Чтобы реагировать на изменения внешнего файла, реализуйте и IVsDocDataFileChangeControl в IVsFileChangeEx объекте данных документа редактора.
Примечание. SVsFileChangeEx Вызов QueryService для получения указателя IVsFileChangeEx на .
- Получите указатель на IVsQueryEditQuerySave2 этот объект, вызвав вызовSVsQueryEditQuerySave QueryService .
- Когда происходит первое событие редактирования, вызовите QueryEditFiles метод. Этот метод предложит пользователю проверка выйти из файла, если он еще не проверка. Не забудьте обработать условие «файл, не проверка отложенный», чтобы предотвратить ошибки.
- Аналогичным образом перед сохранением QuerySaveFile файла вызовите метод. Этот метод предложит пользователю сохранить файл, если он не был сохранен или изменен с момента последнего сохранения.
- Вызовите OnSelectChange каждый раз, когда изменения выделения текста передаются в реализацию ISelectionContainer.
- STrackSelection Вызов службы QueryService для получения указателя ITrackSelectionна .
- Реализуйте IDropTarget в редакторе предупреждение интегрированной среды разработки о том, что редактор является целевым объектом удаления.
- IVsToolboxUser Реализуйте интерфейс в представлении, чтобы редактор мог включить и отключить элементы на панели элементов.
- Реализуйте и вызывайте ResetDefaults QueryService SVsToolbox службу, чтобы получить указатель на IVsToolbox2 интерфейсы и IVsToolbox3 указатели. Эти действия позволяют VSPackage добавлять новые элементы в панель элементов.
- Если вы хотите, чтобы редактор поддерживал поиск и замена команд, реализуйте IVsFindTarget.
- Если вы хотите использовать окно инструментов структуры документа в редакторе, реализуйте IVsDocOutlineProvider .
- Если вы хотите использовать строку состояния в редакторе, реализуйте IVsStatusbarUser и вызовите QueryService SVsStatusbar для получения указателя IVsStatusBar . Например, редактор может отображать сведения о строке или столбце, режим выбора (поток или поле) и режим вставки (вставка или перезабор).
- Если вы хотите, чтобы редактор поддерживал Undo команду, рекомендуемый метод — использовать модель диспетчера отмены OLE. В качестве альтернативы можно напрямую обрабатывать команду редактором Undo .
NoRemove Editors < ForceRemove = s 'RTF Editor' < val Package = s '' ForceRemove Extensions < val rtf = d 50 >> > NoRemove Menus < val = s ',203,11' >Отказоустойчивость
- Экземпляр редактора создается при вызове метода интегрированной среды разработки CreateEditorInstance . Если редактор поддерживает несколько представлений, создает как данные документа, CreateEditorInstance так и объекты представления документов. Если объект данных документа уже открыт, то в ненулевое punkDocDataExisting значение передается IVsEditorFactory::CreateEditorInstance . Реализация фабрики редакторов должна определить, совместим ли существующий объект данных документа, запрашивая соответствующие интерфейсы в нем. Дополнительные сведения см. в разделе «Поддержка нескольких представлений документов».
- При использовании упрощенного подхода внедрения реализуйте IVsWindowPane интерфейс.
- Если вы решите использовать активацию на месте, реализуйте следующие интерфейсы: IOleObjectIOleInPlaceActiveObjectIOleInPlaceComponent
Примечание. Интерфейс IOleInPlaceComponent используется для предотвращения объединения меню OLE 2.
- Document.Object
- Window.Object
См. также
Как добавить модуль в visual studio
Поддержка модулей Стандартной Библиотеки реализована в Visual Studio начиная с версии 2017 RTM. Эта функция на данный момент является опциональной и по умолчанию отключена. В будущих версиях модули будут устанавливаться автоматически вместе с заголовками Стандартной Библиотеки. Вам нужно лишь выбрать эту опцию при установке или обновлении поддержки C++.


Проверка правильности установки
Чтобы проверить, настроена ли ваша копия VS 2017 для поддержки модулей, скомпилируйте и запустите приведенную ниже программу (назовите ее, например, test-vs2017-slm.cxx) из командной строки разработчика. Поскольку модули на данный момент являются экспериментальной функцией, их поддержка пока еще очень слабо реализована в среде VS.
При компиляции этого кода с командой
на выходе должен получиться исполняемый файл (test-vs2017-slm.exe), который при запуске распечатает слова «Plato», «Descartes» и «Bacon» — каждое отдельной строкой.
Ключ компилятора для подключения модулей Стандартной Библиотеки
Необходимо добавить ключ /MD при компиляции исходного файла, чтобы подключить модули Стандартной Библиотеки. Ключ /MD инициализирует динамическую библиотеку времени выполнения C (CRT). В режиме отладки следует использовать ключ /MDd.
Если вы забыли указать ключ /MD (или /MDd в режиме отладки), линковщик выдаст ряд предупреждений и ошибку линковки LNK2019, говорящую о наличии неразрешенных внешних символов.
Никаких других ключей для использования модулей Стандартной Библиотеки не требуется. Эти модули могут применяться только для использования с библиотеками импорта DLL Универсальной библиотеки CRT (UCRT).
Подключение модулей Стандартной Библиотеки из среды разработки VS
Если вы хотите использовать среду разработки вместо командной строки, настройте ваш проект для использования экспериментальных модулей согласно следующей инструкции.
1. Откройте окно «Свойства» (Properties) проекта:

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

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

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

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

Изменение синтаксиса экспорта модулей
На съезде комитета по стандартизации C++ в ноябре 2016 года было принято решение об изменении синтаксиса экспорта модулей (см. Проблема модулей N1).
Настоящая версия 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 будут в большей степени соответствовать предложению по модулям Стандартной Библиотеки.
Призыв к действию
В заключение
О прочих проблемах, связанных с использованием среды MSVC в VS 2017, можно сообщить с помощью функции Сообщить о проблеме (Report a Problem) из установщика или из самой среды Visual Studio. Свои предложения оставляйте на сайте UserVoice. Спасибо!
В данном случае наша программа представляет модуль с именем Module1 . Концепция модулей представляет парадигму модульного программирования, согласно которому вся программа делится на ряд модулей, которые отвечают за разные функции программы. Пока мы использовали только один модуль в программе. Теперь создадим программу из двух модулей — первый модуль будет считывать из файла некоторое значение, а другой модуль будет получать это значение и проводить с ним некоторые операции. Чтобы добавить в программу второй модуль, нажмите справа в окне Solution Explorer (Обозреватель решений) на название проекта правой кнопкой мыши, затем в появившемся списке выберите пункт Add (Добавить) -> Module. (Модуль) .

В открывшемся диалоговом окне выберите пункт Module (Модуль) , оставьте в качестве его имени Module2 и нажмите кнопку Add (Добавить)

Таким образом, мы добавили в программу новый модуль Module2 . В его коде ничего не определено, кроме объявления самого модуля:
Этот модуль будет отвечать у нас за считывание значения из файла. Чтобы считать файл, воспользуемся классом StreamReader , определенным в пространстве имен System.IO. Поэтому нам нужно импортировать данное пространство имен с помощью оператора Imports . Импортирование пространства имен производится в самом начале программы перед определением модуля или класса:
Теперь перейдем к самой реализации нашей программы — определим функцию, которая будет в качестве параметра принимать путь к файлу и будет возвращать считанное значение:
Обратите внимание на конструкцию Try . Catch . End Try — она нужна нам для обработки ошибок. Мы могли бы ее не использовать, но при выполнении программы может возникнуть ошибка. Например, мы введем неверный путь к файлу, и чтобы программа не зависла, а продолжала работать, мы используем данную конструкцию. После выражения Catch определен код для вывода ошибки на экран: Console.WriteLine(ex.Message).
Весь код нашей программы сосредоточен в трех строках между Try и Catch:
В первой строке мы создаем поток для считывания файла, который мы получаем из параметра path. Чтобы создать новый объект используется ключевое слово New . Во второй строке мы считываем первый символ из файла. Метод ReadLine класса StreamReader считывает одну строку из файла, поэтому нам надо будет потом ее привести к типу Integer и полученное значение присвоить переменной number. В третьей строке мы закрываем поток методом Close .
Теперь перейдем к главному модулю. Он будет получать результат из модуля Module2 и вычислять факториал числа:
Итак, этот код должен быть вам в целом знаком: сначала мы вводим путь к файлу, передаем его в функцию Read , которая определена в модуле Module2 . Так как мы для модуля Module2 определили пространство имен, то надо указать и его, поэтому вызов метода имеет следующий вид:

Состав панели элементов меняется в зависимости от того, какую платформу вы выбираете для разработки. Например, ниже на рисунке показаны различные варианты Toolbox для трех вариантов проектов: WinForms, WPF и UWP:

По умолчанию в панели элементов (toolbox) появятся только стандартные элементы управления. Например, мы захотим использовать в нашем проекте компоненты Ribbon Controls (как в Office). Для того, чтобы их использовать в своем проекте, мы должны добавить ссылку на них в свой проект. Сделать это можно следующим образом:


Теперь мы можем подключать необходимые пространства имен в наш проект и использовать компоненты в проекте. Однако в панели элементов они не появятся. Для того, чтобы добавить их в панель элементов необходимо выполнить ещё несколько простых действий.
Добавим наши компоненты Ribbon Controls в панель элементов. Элементы могут добавляться как в уже существующие вкладки, так и в новые, созданные нами. Воспользуемся вторым вариантом.




5. Теперь в панели элементов появятся новые элементы управления, которые можно добавлять на форму приложения простым перетаскиванием мышкой:
Сегодня мы разобрались с вопросом как добавить новые элементы управления в проект и добавить их в панель элементов (toolbox) Visual Studio 2019. Не всегда устанавливаемые элементы управления автоматически отображаются в панели элементов, поэтому иногда требуется воспользоваться их добавлением вручную, используя возможности IDE.
В качестве примера мы рассмотрим подключение библиотеки SDL к нашему проекту в Visual Studio 2017 (работать будет и с более новыми версиями Visual Studio).
Шаг №1: Создаем папку для хранения библиотеки
Создаем папку Libs на диске C ( C:\Libs ).
Шаг №2: Скачиваем и устанавливаем библиотеку

Шаг №3: Указываем путь к заголовочным файлам библиотеки
Открываем свой любой проект в Visual Studio или создаем новый, переходим в «Обозреватель решений» > кликаем правой кнопкой мыши (ПКМ) по названию нашего проекта > «Свойства» :

В «Свойства конфигурации» ищем вкладку «С/С++» > «Общие» . Затем выбираем пункт «Дополнительные каталоги включаемых файлов» > нажимаем на стрелочку в конце > «Изменить» :

В появившемся окне кликаем на иконку с изображением папки, а затем на появившееся троеточие:

Заголовочные файлы находятся в папке include внутри нашей библиотеки, поэтому переходим в нее ( C:\Libs\SDL2-2.0.9\include ) и нажимаем «Выбор папки» , а затем «ОК» :

Шаг №4: Указываем путь к файлам с реализацией библиотеки
Переходим на вкладку «Компоновщик» > «Общие» . Ищем пункт «Дополнительные каталоги библиотек» > нажимаем на стрелочку в конце > «Изменить» :

Опять же, нажимаем на иконку с папкой, а затем на появившееся троеточие. Нам нужно указать следующий путь: C:\Libs\SDL2-2.0.9\lib\x86 . Будьте внимательны, в папке lib находятся две папки: x64 и x86 . Даже если у вас Windows разрядности x64, указывать нужно папку x86 . Затем «Выбор папки» и «ОК» :

После этого переходим в «Компоновщик» > «Ввод» . Затем «Дополнительные зависимости» > нажимаем на стрелочку в конце > «Изменить» :

В появившемся текстовом блоке вставляем:

Затем переходим в «Компоновщик» > «Система» . После этого «Подсистема» > нажимаем на стрелочку вниз > выбираем «Консоль (/SUBSYSTEM:CONSOLE)» > «Применить» > «ОК» :

Шаг №5: Копируем dll-ку в папку с проектом
Переходим в папку x86 ( C:\Libs\SDL2-2.0.9\lib\x86 ), копируем SDL2.dll и вставляем в папку с вашим проектом в Visual Studio. Чтобы просмотреть папку вашего проекта в Visual Studio, нажмите ПКМ по названию вашего проекта > «Открыть содержащую папку» :

Затем вставляем скопированный файл (SDL2.dll) в папку с проектом (где находится рабочий файл .cpp):

Шаг №6: Тестируем
Теперь, чтобы проверить, всё ли верно мы сделали — копируем и запускаем следующий код:
Читайте также:
- Как создать textbox excel
- Как скопировать текст из adobe flash player
- Как изменить выпадающий список в excel
- Создание психологического теста в эксель
- Настройка 1с бухгалтерия 8 3
Как в Visual studio code подключить модули?

Я хотела установить модуль colorama и вписала в терминал pip install colorama Но он показал мне ошибку
Отслеживать
задан 11 янв 2021 в 17:38
user418787 user418787
У вас добавлен питон в PATH?
11 янв 2021 в 17:45
При установке Пайтоне я ставила галочку на PATH
– user418787
11 янв 2021 в 18:06
Тогда странно. Вы после установки перезагружали пк?
11 янв 2021 в 18:11Да (не обращайте внимание на это, просто нужно чтобы было много слов, так как меня Стэк не допускает)
– user418787
12 янв 2021 в 5:052 ответа 2
Сортировка: Сброс на вариант по умолчанию
- Запустите установку через cmd. Там будет видно есть ошибки ли нет. IDE не всегда надежны в этом вопросе. И проверьте если ли pip pip -V
- Если pip нет и в консоли то лучше всего переустановите Python (просто так проще)
- Установить pip вручную. Скачиваем get-pip и устанавливаем python get-pip.py
Отслеживать
ответ дан 11 янв 2021 в 18:14
3,186 2 2 золотых знака 9 9 серебряных знаков 16 16 бронзовых знаков
Отслеживать
ответ дан 11 янв 2021 в 17:40
16 2 2 бронзовых знака
Боюсь что в данном случае нужна библиотека python а они через маркетплейс VSC не ставятся.
11 янв 2021 в 18:23-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Руководство по именованным модулям (C++)
В этом руководстве описывается создание модулей C++20. Модули заменяют файлы заголовков. Вы узнаете, как модули являются улучшением файлов заголовков.
Из этого руководства вы узнаете, как:
- Создание и импорт модуля
- Создание основного блока интерфейса модуля
- Создание файла секционирования модуля
- Создание файла реализации единицы модуля
Необходимые компоненты
Для этого руководства требуется Visual Studio 2022 17.1.0 или более поздней версии.
При работе с примером кода в этом руководстве могут возникать ошибки IntelliSense. Работа с подсистемой IntelliSense догоняет компилятора. Ошибки IntelliSense можно игнорировать и не препятствовать созданию примера кода. Чтобы отслеживать ход выполнения работы IntelliSense, ознакомьтесь с этой проблемой.
Что такое модули C++
Файлы заголовков — это способ совместного использования объявлений и определений между исходными файлами в C++. Файлы заголовков являются хрупкими и трудными для создания. Они могут скомпилироваться по-разному в зависимости от порядка, в который они включены, или макросов, которые не определены. Они могут замедлить компиляцию, так как они повторно обработаны для каждого исходного файла, включающего их.
C++20 представляет современный подход к компонентизации программ C++: модулей.
Как и файлы заголовков, модули позволяют совместно использовать объявления и определения в исходных файлах. Но в отличие от файлов заголовков модули не утечки определений макросов или частных сведений о реализации.
Модули проще создавать, так как их семантика не изменяется из-за определений макросов или импорта, порядка импорта и т. д. Они также упрощают управление тем, что видно потребителям.
Модули обеспечивают дополнительную безопасность, чтобы файлы заголовков не были. Компилятор и компоновщик работают вместе, чтобы предотвратить возможные проблемы с конфликтом имен и обеспечить более строгие гарантии одного правила определения (ODR).
Модель строгой собственности избегает столкновений между именами во время связи, так как компоновщик присоединяет экспортированные имена к модулю, экспортируемом им. Эта модель позволяет компилятору Microsoft Visual C++ предотвратить неопределенное поведение, вызванное связыванием различных модулей, сообщающих аналогичные имена в одной программе. Дополнительные сведения см. в разделе «Строгое владение».
Модуль состоит из одного или нескольких файлов исходного кода, скомпилированных в двоичный файл. Двоичный файл описывает все экспортированные типы, функции и шаблоны в модуле. Когда исходный файл импортирует модуль, компилятор считывает двоичный файл, содержащий содержимое модуля. Чтение двоичного файла гораздо быстрее, чем обработка файла заголовка. Кроме того, двоичный файл повторно используется компилятором при каждом импорте модуля, сохраняя еще больше времени. Так как модуль создается один раз, а не каждый раз при импорте, время сборки может быть сокращено, иногда резко.
Более важно, что модули не имеют проблем с хрупкостью, которые выполняют файлы заголовков. Импорт модуля не изменяет семантику модуля или семантику любого импортированного модуля. Макросы, директивы препроцессора и не экспортированные имена, объявленные в модуле, не видны исходному файлу, который импортирует его. Модули можно импортировать в любом порядке, и они не изменят смысл модулей.
Модули можно использовать параллельно с файлами заголовков. Эта функция удобна, если вы переносите базу кода для использования модулей, так как это можно сделать на этапах.
В некоторых случаях файл заголовка можно импортировать как блок заголовка, а не как #include файл. В качестве альтернативы файлам предкомпилированных заголовков (PCH) рекомендуется использовать блоки заголовков. Они проще настроить и использовать, чем общие PCH-файлы , но они обеспечивают аналогичные преимущества производительности. Дополнительные сведения см. в пошаговом руководстве. Создание и импорт единиц заголовков в Microsoft Visual C++.
Код может использовать модули в том же проекте или любые проекты, на которые ссылается ссылка, автоматически с помощью ссылок на проекты статической библиотеки.
Создание проекта
По мере создания простого проекта мы рассмотрим различные аспекты модулей. Проект реализует API с помощью модуля вместо файла заголовка.
В Visual Studio 2022 или более поздней версии выберите «Создать проект», а затем тип проекта консольного приложения (для C++). Если этот тип проекта недоступен, возможно, при установке Visual Studio не выбрана рабочая нагрузка для настольных компьютеров с рабочей нагрузкой C++ . Установщик Visual Studio можно использовать для добавления рабочей нагрузки C++ .
Присвойте новому проекту имя ModulesTutorial и создайте проект.
Так как модули являются компонентом C++20, используйте /std:c++20 параметр или /std:c++latest компилятор. В Обозреватель решений щелкните правой кнопкой мыши имя ModulesTutorial проекта, а затем выберите «Свойства«. В диалоговом окне «Страницы свойств проекта» измените конфигурацию на все конфигурации и платформу на все платформы. Выберите «Свойства>конфигурации» в области представления дерева слева. Выберите свойство C++ Language Standard. Используйте раскрывающийся список, чтобы изменить значение свойства на ISO C++20 Standard (/std:c++20). Нажмите кнопку «ОК «, чтобы принять изменение.

Базовым описанием файла определения интерфейса модуля является:
module; // optional. Defines the beginning of the global module fragment // #include directives go here but only apply to this file and // aren't shared with other module implementation files. // Macro definitions aren't visible outside this file, or to importers. // import statements aren't allowed here. They go in the module preamble, below. export module [module-name]; // Required. Marks the beginning of the module preamble // import statements go here. They're available to all files that belong to the named module // Put #includes in in the global module fragment, above // After any import statements, the module purview begins here // Put exported functions, types, and templates here module :private; // optional. The start of the private module partition. // Everything after this point is visible only within this file, and isn't // visible to any of the other files that belong to the named module.Этот файл должен начинаться либо с указания начала глобального фрагмента модуля, либо module; export module [module-name]; для указания начала модуля purview.
Модуль purview — это место, где функции, типы, шаблоны и т. д., перейдите к тому, что вы хотите предоставить из модуля.
Кроме того, вы можете предоставлять другие модули или секции модулей с помощью export import ключевое слово, как показано в BasicPlane.Figures.ixx файле.
Файл первичного интерфейса должен экспортировать все секции интерфейса, определенные для модуля напрямую или косвенно, или программа не сформирована.
Раздел частного модуля — это место, в котором можно поместить вещи, которые вы хотите видеть только в этом файле.
Единицы интерфейса модуля предусловлили ключевое слово module с помощью ключевое слово export .
Дополнительные сведения о синтаксисе модуля см. в разделе «Модули».
Единицы реализации модуля
Единицы реализации модуля принадлежат именованным модулю. Именованный модуль, к которому они относятся, указывается module [module-name] инструкцией в файле. Единицы реализации модуля предоставляют сведения о реализации, которые, по соображениям гигиены кода или других причин, не нужно помещать в основной интерфейс модуля или в файл секционирования модуля.
Единицы реализации модуля полезны для разбиения большого модуля на небольшие части, что может привести к более быстрому времени сборки. Этот метод кратко рассматривается в разделе «Рекомендации «.
Файлы единиц реализации модуля имеют .cpp расширение. Базовым описанием файла единицы реализации модуля является:
// optional #include or import statements. These only apply to this file // imports in the associated module's interface are automatically available to this file module [module-name]; // required. Identifies which named module this implementation unit belongs to // implementationФайлы секционирования модуля
Секции модулей предоставляют способ компонентизации модуля в разные части или секции. Секции модулей предназначены для импорта только в файлах, которые являются частью именованного модуля. Их нельзя импортировать за пределы именованного модуля.
Раздел содержит файл интерфейса и ноль или более файлов реализации. Раздел модуля предоставляет общий доступ ко всем объявлениям во всем модуле.
Все имена, экспортированные файлами интерфейса секционирования, должны быть импортированы и повторно экспортированы ( export import ) по файлу первичного интерфейса. Имя раздела должно начинаться с имени модуля, за которым следует двоеточие, а затем имя секции.
Базовая структура файла интерфейса секционирования выглядит следующим образом:
module; // optional. Defines the beginning of the global module fragment // This is where #include directives go. They only apply to this file and aren't shared // with other module implementation files. // Macro definitions aren't visible outside of this file or to importers // import statements aren't allowed here. They go in the module preamble, below export module [Module-name]:[Partition name]; // Required. Marks the beginning of the module preamble // import statements go here. // To access declarations in another partition, import the partition. Only use the partition name, not the module name. // For example, import :Point; // #include directives don't go here. The recommended place is in the global module fragment, above // export imports statements go here // after import, export import statements, the module purview begins // put exported functions, types, and templates for the partition here module :private; // optional. Everything after this point is visible only within this file, and isn't // visible to any of the other files that belong to the named module. .Рекомендации по модулю
Модуль и код, импортируемый им, должны быть скомпилированы с теми же параметрами компилятора.
Именование модуля
- Вы можете использовать периоды (‘.’) в именах модулей, но они не имеют особого значения для компилятора. Используйте их для передачи смысла пользователям модуля. Например, начните с библиотеки или верхнего пространства имен проекта. Завершите работу с именем, описывающим функциональные возможности модуля. BasicPlane.Figures предназначен для передачи API для геометрических плоскостей, а именно цифры, которые могут быть представлены на плоскости.
- Имя файла, содержащего основной интерфейс модуля, обычно является именем модуля. Например, учитывая имя BasicPlane.Figures модуля, имя файла, содержащего первичный интерфейс, будет названо BasicPlane.Figures.ixx .
- Имя файла секционирования модуля обычно — находится в том месте, где за именем модуля следует дефис (‘-), а затем имя секции. Например BasicPlane.Figures-Rectangle.ixx .
Если вы создаете из командной строки и используете это соглашение об именовании для секций модулей, вам не придется явно добавлять /reference для каждого файла секционирования модуля. Компилятор будет искать их автоматически на основе имени модуля. Имя скомпилированного файла секции (заканчивается .ifc расширением) создается из имени модуля. Рассмотрим имя BasicPlane.Figures:Rectangle модуля: компилятор ожидает, что соответствующий скомпилированный файл секции для Rectangle именован BasicPlane.Figures-Rectangle.ifc . Компилятор использует эту схему именования, чтобы упростить использование секций модулей, автоматически найдя файлы единиц интерфейса для секций.
Их можно назвать с помощью собственного соглашения. Но затем необходимо указать соответствующие /reference аргументы компилятору командной строки.
Модули факторов
Используйте файлы реализации модуля и секции, чтобы учитывать модуль для упрощения обслуживания кода и потенциально более быстрого времени компиляции.
Например, перемещение реализации модуля из файла определения интерфейса модуля и в файл реализации модуля означает, что изменения в реализации не обязательно вызывают повторную компиляцию каждого файла, импорта модуля (если у вас нет inline реализаций).
Секции модулей упрощают логический фактор большого модуля. Их можно использовать для улучшения времени компиляции, чтобы изменения в части реализации не приводили к повторной компиляции всех файлов модуля.
Итоги
В этом руководстве вы ознакомились с основами модулей C++20. Вы создали первичный интерфейс модуля, определили секцию модуля и создали файл реализации модуля.