Я создал несколько библиотек С++, которые в настоящее время только для заголовков. И интерфейс, и реализация моих классов записываются в один и тот же файл .hpp
.
Недавно я начал думать, что такой дизайн не очень хорош:
- Если пользователь хочет скомпилировать библиотеку и связать ее динамически, он/она не может.
- Изменение одной строки кода требует полной перекомпиляции существующих проектов, которые зависят от библиотеки.
Мне очень нравятся аспекты только для заголовков: все функции становятся потенциально встроенными, и их очень легко включить в ваши проекты - нет необходимости компилировать/связывать что-либо, просто простую директиву #include
.
Можно ли получить лучшее из обоих миров? Я имею в виду - позволяя пользователю выбирать, как он хочет использовать библиотеку. Это также ускорит разработку, поскольку я буду работать в библиотеке в режиме динамической компоновки, чтобы избежать абсурдного времени компиляции и выпускать готовые продукты в режиме "только для заголовка", чтобы максимизировать производительность.
Первый логический шаг, делящий интерфейс и реализацию в файлах .hpp
и .inl
.
Я не уверен, как идти вперед. Я видел много библиотек, добавляющих макросы LIBRARY_API
к их объявлениям функций/классов - может быть, что-то подобное понадобится, чтобы пользователь мог выбрать?
EDIT: все мои функции библиотеки имеют префикс с ключевым словом inline
, чтобы избежать ошибок "множественного определения...". Я предполагаю, что ключевое слово будет заменено макросом LIBRARY_INLINE
в файлах .inl
? Макрос будет разрешен для inline
для "режима только для заголовка" и ни для чего для "режима динамической привязки".