Постройте заголовок/осуществление (опционально) как модуль. ⇐ C++
-
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.
У меня есть большая база устаревшего кода 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.
Мобильная версия