Постройте заголовок/осуществление (опционально) как модуль.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Постройте заголовок/осуществление (опционально) как модуль.

Сообщение Anonymous »


У меня есть большая база устаревшего кода C++, использующая заголовки и реализации в файлах hpp/cpp. Это должно быть доступно для совместимости со старыми компиляторами.

Файлы примеров

// myLib.hpp интервал Фу(); // мояLib.cpp #include "myLib.hpp" int foo() {возвращение 42; } // основной.cpp #include "myLib.hpp" int main() { return foo(); } Для новых компиляторов я хотел бы иметь возможность компилировать определенные заголовки в модули (например, «myModule»). Как оболочка файлов hpp/cpp. Это не должно быть заменой, поскольку некоторые зависимые единицы перевода могут по-прежнему использовать #include "myLib.hpp", тогда как другие могут уже использовать import myModule;.

Если модуль вообще должен быть создан и использован, это можно выбрать с помощью параметра CMake, который преобразуется в макрос препроцессора, например

# CMakeLists.txt опция (CMAKE_USE_MODULES «Включить использование модуля C++20» ON) если (CMAKE_USE_MODULES) add_compile_definitions (USE_MODULES) endif(CMAKE_USE_MODULES) Мой вопрос: как следует реализовать интерфейс модуля и его реализацию?

// myLib.hpp ЭКСПОРТ int foo(); // мояLib.cpp #define ЭКСПОРТ #include "myLib.hpp" int foo() {возвращение 42; } // мойМодуль.cpp модуль экспорта myModule; #define ЭКСПОРТ экспорт #include "myLib.hpp" // myModule_impl.cpp модуль мойМодуль; #include "myLib.cpp" Другие единицы перевода теперь имеют возможность использовать заголовок или модуль, например

// tu_alwaysHeader.cpp #define ЭКСПОРТ #include "myLib.hpp" int AlwaysHeader() { return foo(); } // tu_tryModuleOtherwiseHeader.cpp #ifdef USE_MODULES импортировать мойМодуль; #еще #define ЭКСПОРТ #include "myLib.hpp" #endif int tryModuleOtherwiseHeader() { return foo(); } Еще один вопрос: как должна быть представлена ​​зависимость в CMake? Особенно myModule.cpp на myLib.hpp и myModule_impl.cpp на myLib.cpp?

Минимальный пример использования godbolt.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»