Я изучаю возможность использования C ++ Modules TS в своем любимом проекте. Одним из важных вариантов использования для меня является упаковка устаревших заголовков.
Предположим, у меня есть заголовочный файл с некоторыми функциями и классами, std.io.ixx:
int f(int x)
{
return 2 + x;
}
В соответствии с Эта статья, Я компилирую модуль, используя следующую команду:
cl /c /experimental:module /module:name std.io /module:export std.io.ixx
Что дает мне новый файл std.io.ifc
, Затем я использую этот модуль в другом исходном файле, main.cxx:
import std.io;
int main()
{
f(5);
}
Который скомпилирован с помощью следующей команды:
cl /c /experimental:module main.cxx
Компиляция выдает мне следующую ошибку:
main.cxx(5): error C3861: 'f': identifier not found
Итак, как мы видим, идентификаторы из модуля не были экспортированы. Я мог бы исправить это, добавив вручную export
Ключевое слово перед каждым идентификатором, который я хочу экспортировать, но это невозможно для варианта использования оберточных заголовков.
Что я делаю не так? Как экспортировать все возможные идентификаторы из заголовка?
Я считаю, что есть две вещи неправильно:
Имя модуля не должно начинаться с std.
, Когда я попытался сделать это, я получил ошибку
error C3674: could not find standard library module 'std.io'
Эта ошибка может не отображаться, если вы не установили компонент Стандартные библиотечные модули для Visual Studio. Я не уверен в этом, хотя.
В записи блога, на которую вы ссылаетесь, есть эта заметка:
Обратите внимание, что в настоящее время вы должны включить свой заголовок в файл .cpp (или переименовать свой заголовок) из-за ограничения в обработке файлов нашим компилятором.
Это действительно так, потому что, когда я пытался с расширением ixx
Я получил ту же ошибку, что и вы.
Но после исправления обеих вышеперечисленных проблем все заработало нормально.
Других решений пока нет …