Visual Studio 2019: Невозможно «импортировать» объявление стандартной библиотеки C в файл cpp, не импортировав его сначала в отдельный модуль (ixx)

#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 :

  1. Стандарт Языка C : Предварительный просмотр — Функции Из Последнего Рабочего Проекта C /std:последняя версия c
  2. Включить Экспериментальные модули стандартной библиотеки C : Да (/экспериментальный:модуль)
  3. Источники Сканирования Для Зависимостей Модулей: Да

Я использую Microsoft Visual Studio Community 2019 версии 16.11.8

Ответ №3:

Как написано в пошаговом руководстве: Импорт библиотек STL в качестве единиц заголовка теперь есть два способа сделать стандартные заголовки импортируемыми:

  1. Включите проверку системы сборки на наличие импортированных файлов заголовков. Это может быть включено с помощью «Свойства конфигурации -> C/C ->> Общие ->>> Источники сканирования для зависимостей модулей», которое имеет следующее описание: «Позволяет сборке сканировать все источники c , а не только интерфейс модуля и источники блоков заголовка, для зависимостей модулей и блоков заголовка». Как вы можете видеть из описания, без этой опции только интерфейс модуля и источники блоков заголовка проверяются на наличие зависимостей. Имейте в виду, что сканирование всех источников в крупных проектах может занять много времени. Поэтому предпочтительнее использовать второй способ.
  2. Создайте другой проект статической библиотеки, в котором будут созданы все блоки заголовков, которые вы хотите использовать, и ссылайтесь на эту библиотеку в своем исходном проекте. Например, эта статическая библиотека может содержать один файл cpp, содержащий только import s всех необходимых блоков заголовка, и эта библиотека может использовать «Источники сканирования для зависимостей модулей» (из стр. 1), не влияя на время сборки исходного проекта.