Как экспортировать функции и классы из модуля, не используя ключевое слово `export`?
Я изучаю возможность использования 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
Ключевое слово перед каждым идентификатором, который я хочу экспортировать, но это невозможно для варианта использования оберточных заголовков.
Что я делаю не так? Как экспортировать все возможные идентификаторы из заголовка?
1 ответ
Я считаю, что есть две вещи неправильно:
Имя модуля не должно начинаться с
std.
, Когда я попытался сделать это, я получил ошибкуerror C3674: could not find standard library module 'std.io'
Эта ошибка может не отображаться, если вы не установили компонент Стандартные библиотечные модули для Visual Studio. Я не уверен в этом, хотя.
В записи блога, на которую вы ссылаетесь, есть эта заметка:
Обратите внимание, что в настоящее время вы должны включить свой заголовок в файл.cpp (или переименовать свой заголовок) из-за ограничения в обработке файлов нашим компилятором.
Это действительно так, потому что, когда я пытался с расширением
ixx
Я получил ту же ошибку, что и вы.
Но после исправления обеих вышеперечисленных проблем все заработало нормально.