Библиотека шаблонов только для заголовков C ++ - PullRequest
10 голосов
/ 01 июня 2011

Глядя на этот проект (http://www.savarese.com/software/libssrckdtree/) Я нашел определение «Библиотека шаблонов только для заголовков C ++». На данный момент у меня есть базовые знания C ++, но я хотел бы знать, что это значит и почему эти люди используют его в этом проекте

Ответы [ 9 ]

13 голосов
/ 01 июня 2011

Это означает, что все определения шаблона (шаблон функции или шаблон класса) находятся только в заголовках. Нет файла .cpp. Есть только .h файлы (или некоторые другие расширения, такие как .hpp или вообще без расширения, например <vector>, string> и т. Д.)

Компиляторы C ++ требуют, чтобы определения шаблонов присутствовали в том же файле, в котором они объявлены. Таким образом, библиотека только для заголовка не является ни статической, ни динамической библиотекой. Его библиотека source-code означает, что вы можете увидеть реализацию в заголовках. Вы включили заголовочные файлы в свой код, который компилируется вместе с заголовками из библиотеки.

Обратите внимание на ту часть стандартной библиотеки C ++, в которой используются такие шаблоны, как <vector>, string>, <map> и т. Д. - это библиотека только для заголовков.

На самом деле шаблоны (шаблоны классов и шаблоны функций) не могут быть скомпилированы в статическую или динамическую библиотеку для связи с программами. Шаблон, как говорит сам термин, шаблон; это не нормальный код; Только когда вы используете его в своем коде, передавая аргументы шаблона (который является type или value), компилятор генерирует скомпилируемую функцию / класс из шаблона функции / класса:

template<typename T>
struct A
{
   T data;
};

struct B
{
   int data;
};

Здесь A нельзя скомпилировать в двоичный файл (статическая или динамическая библиотека), поскольку компилятор не знает, что такое T. Но B можно скомпилировать в двоичный файл, так как компилятор имеет полную информацию об этом.

Таким образом, вы можете прочитать фразу "шаблон класса A" , так как: A - это шаблон для класса. A сам по себе не класс. Но B - это класс, а не шаблон.

Поскольку шаблон класса A не может быть скомпилирован в статическую или динамическую библиотеку для связи с вашими программами, поэтому A может быть доставлен только как header-only библиотека с полным исходным кодом. Аналогично

4 голосов
/ 01 июня 2011

Некоторые библиотеки принимают форму двоичного файла, который вы должны связать с вашим проектом, вместе с файлом заголовка, который определяет доступные классы или функции. «Библиотека только для заголовков» - это библиотека, в которой нет двоичного файла, а только заголовок, который вы включаете в свой источник.

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

3 голосов
/ 01 июня 2011

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

1 голос
/ 01 июня 2011

Это означает, что весь код находится в заголовочных файлах; нет библиотек связано с библиотекой. Что это значит на практике зависит - в худшем случае это означает, что автор никогда скомпилировал код :-). Скорее всего, это означает, что код никогда был протестирован с точным сочетанием компилятора, версии и параметров что вы используете, и это время компиляции будет стрелять вверх. С другой Это означает, что вы можете использовать библиотеку, даже если автор не иметь доступ к тому же компилятору, что и вы, и вы не обязаны использовать какие бы опции он не использовал, когда собирал библиотеку. Или же в качестве альтернативы, если это открытый исходный код, вам не нужно собирать библиотеку сами.

1 голос
/ 01 июня 2011

Короткий ответ: шаблоны очень похожи на макросы для компилятора, генерирующего код. Каждый раз, когда вы его создаете (например, с использованием типа, подобного std::list<int>), компилятор должен иметь исходный код для вставки правильного типа (в данном случае int) в код класса шаблона. Вот почему классы шаблонов включаются в .h файлы каждый раз, когда вам необходимо использовать их в .cpp файлах.

0 голосов
/ 01 июня 2011

Это означает, что вам не нужно связывать какие-либо внешние библиотеки во время фазы связывания вашей разработки. Вам нужно только загрузить библиотеку и использовать макросы #include, чтобы использовать библиотеку. Это упрощает развертывание вашего приложения в будущем, но иногда за счет более длительного времени компиляции.

0 голосов
/ 01 июня 2011

Это «только заголовок», поскольку он не содержит отдельных файлов .cpp, только файлы .h, и поэтому вы можете просто #include весь код библиотеки в свой код.

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

0 голосов
/ 01 июня 2011

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

0 голосов
/ 01 июня 2011

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

Преимущества этого подхода

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

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

...