Подтвердить что ты не робот

Когда следует рассмотреть возможность создания библиотеки только для заголовка?

Очевидно, что библиотеки шаблонов должны быть только заголовками, но для не-шаблонов, когда вы должны создавать только заголовки?

4b9b3361

Ответ 1

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

Тогда любой, кто использует вашу библиотеку во множестве разных ТУ, и подозревает, что это может стоить много времени компиляции, может легко внести изменения, чтобы проверить его.

Как только вы знаете, что у пользователей есть возможность использовать библиотеку, ответ, вероятно, становится "предлагать эту опцию, когда это возможно". Так что в значительной степени в любое время, включая его из нескольких TU, не нарушалось бы ODR. Например, если ваши свободные функции static относятся к static globals, то вам не повезло, поскольку различные определения этой функции в разных TU будут ссылаться на разные объекты с тем же именем, что является УСО-нарушение.

Ответ 2

Вы можете следовать за Boost.Asio lead.

Они просто предоставляют две версии библиотек: только для заголовка и header + library.

Они делают это с одним макросом, который должен быть определен (или нет), прежде чем включать их заголовки. Я думаю, что по умолчанию (если не определено) используется версия только для заголовков.

См. Дополнительная отдельная компиляция.

Обратите внимание на то, как они аккуратно предоставляют один исходный файл для компиляции, который определяет все или возможность связывания с динамически загруженной библиотекой.

Ответ 3

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

Я не могу представить себе случай, когда библиотека без шаблонов действительно должна быть только заголовком. Однако иногда это может быть разумным по эффективности, чтобы разрешить встраивание всего кода. Примером может быть библиотека оберток вокруг интерфейсов, специфичных для платформы, например. для таких вещей, как примитивы синхронизации, поточно-локальное хранилище, реализация сценариев, связанных с платформой и компилятором, и т.д.

Ответ 4

Без шаблонов у вас будут фактические определения в заголовках. Это означает, что если два файла включают ваш заголовок, вы получите несколько определений и код не будет компилироваться.

Другими словами, определение определений в заголовках - очень плохая идея. Вы должны придерживаться только объявлений и шаблонов.

Что касается шаблонов, компиляторы знают, что вы можете включать один и тот же заголовок более одного раза, они не будут генерировать один и тот же код снова и снова.

EDIT: Если вы имеете в виду "держать все в строю", я думаю, что это очень плохой подход. Файлы заголовков становятся полностью нечитаемыми, и любые изменения в реализации заставляют любого пользователя вашей библиотеки перекомпилировать все.