#c #c 20
Вопрос:
При попытке использовать команду C 20 import
для загрузки стандартного объявления библиотеки в файле .cpp возвращается ошибка компилятора, в которой говорится, что «блок заголовка» не найден.
Например, в файле, скажем Main.cpp, я поставил
import <iostream>;
int main()
{
return 0;
}
Следующие результаты ошибки компилятора:
error C7612: could not find header unit for 'C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includeiostream'
Однако, если я добавлю модуль в проект, скажем Test.ixx, следующим образом
export module Test;
import <iostream>;
а затем импортируйте модуль Test
в Main.cpp:
import Test;
import <iostream>;
int main()
{
return 0;
}
Тогда никаких проблем. Код строится просто отлично.
Является ли это просто случаем, когда реализации компилятора C 20 все еще разрабатываются? До сих пор у меня сложилось впечатление, что заголовки стандартной библиотеки должны быть «импортируемыми» безоговорочно-то есть без необходимости import
в модуле в другом месте-но тогда я только недавно начал экспериментировать с новыми функциями в C 20.
Примечание: Я также опробовал это с другими объявлениями стандартных библиотек, например <vector>
, и т. Д., С теми же результатами.
Ответ №1:
Импорт stl не указан в C 20, но VS позволяет это сделать, выполнив
import std.core;
Фрагмент из https://docs.microsoft.com/en-us/cpp/cpp/modules-cpp?view=msvc-160
Несмотря на то, что стандарт C 20 не указан, Корпорация Майкрософт позволяет импортировать свою реализацию стандартной библиотеки C в виде модулей. Импортируя стандартную библиотеку C в виде модулей, а не #включая ее в файлы заголовков, вы потенциально можете ускорить время компиляции в зависимости от размера вашего проекта. Библиотека состоит из следующих модулей:
std.регулярное выражение предоставляет содержимое заголовка <регулярное выражение> <регулярное выражение>
std.файловая система обеспечивает содержание заголовка <filesystem>
СТД.память дает содержание заголовка <memory>
СТД.нарезание резьбы обеспечивает содержание заголовков <atomic>, <condition_variable>, <future>, <mutex>, <shared_mutex>и <thread>
СТД.ядро обеспечивает все остальное в стандартной библиотеки C
, чтобы использовать эти модули, просто добавьте объявление импорта в верхней части файла исходного кода.
Ответ №2:
Существует 3 варианта использования стандартных библиотечных модулей в Visual Studio: В Свойствах проекта C/C :
- Стандарт Языка C : Предварительный просмотр — Функции Из Последнего Рабочего Проекта C /std:последняя версия c
- Включить Экспериментальные модули стандартной библиотеки C : Да (/экспериментальный:модуль)
- Источники Сканирования Для Зависимостей Модулей: Да
Я использую Microsoft Visual Studio Community 2019 версии 16.11.8
Ответ №3:
Как написано в пошаговом руководстве: Импорт библиотек STL в качестве единиц заголовка теперь есть два способа сделать стандартные заголовки импортируемыми:
- Включите проверку системы сборки на наличие импортированных файлов заголовков. Это может быть включено с помощью «Свойства конфигурации -> C/C ->> Общие ->>> Источники сканирования для зависимостей модулей», которое имеет следующее описание: «Позволяет сборке сканировать все источники c , а не только интерфейс модуля и источники блоков заголовка, для зависимостей модулей и блоков заголовка». Как вы можете видеть из описания, без этой опции только интерфейс модуля и источники блоков заголовка проверяются на наличие зависимостей. Имейте в виду, что сканирование всех источников в крупных проектах может занять много времени. Поэтому предпочтительнее использовать второй способ.
- Создайте другой проект статической библиотеки, в котором будут созданы все блоки заголовков, которые вы хотите использовать, и ссылайтесь на эту библиотеку в своем исходном проекте. Например, эта статическая библиотека может содержать один файл cpp, содержащий только
import
s всех необходимых блоков заголовка, и эта библиотека может использовать «Источники сканирования для зависимостей модулей» (из стр. 1), не влияя на время сборки исходного проекта.