Когда мне следует подумать о создании библиотеки только для заголовков? - PullRequest
25 голосов
/ 29 мая 2011

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

Ответы [ 4 ]

14 голосов
/ 29 мая 2011

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

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

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

3 голосов
/ 29 мая 2011

Вы можете следовать примеру Boost.Asio.

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

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

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

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

0 голосов
/ 29 мая 2011

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

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

0 голосов
/ 29 мая 2011

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

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

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

РЕДАКТИРОВАТЬ: Если вы имеете в виду "держать все в курсе", я думаю, что это очень плохой подход.Заголовочные файлы становятся полностью нечитаемыми, и любое изменение в реализации заставляет любого пользователя вашей библиотеки перекомпилировать все.

...