Как экспортировать функции и классы из модуля, не используя ключевое слово `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

Решение

Я считаю, что есть две вещи неправильно:

  1. Имя модуля не должно начинаться с std., Когда я попытался сделать это, я получил ошибку

    error C3674: could not find standard library module 'std.io'
    

    Эта ошибка может не отображаться, если вы не установили компонент Стандартные библиотечные модули для Visual Studio. Я не уверен в этом, хотя.

  2. В записи блога, на которую вы ссылаетесь, есть эта заметка:

    Обратите внимание, что в настоящее время вы должны включить свой заголовок в файл .cpp (или переименовать свой заголовок) из-за ограничения в обработке файлов нашим компилятором.

    Это действительно так, потому что, когда я пытался с расширением ixxЯ получил ту же ошибку, что и вы.

Но после исправления обеих вышеперечисленных проблем все заработало нормально.

1

Другие решения

Других решений пока нет …