Как мне создать библиотеку только для заголовков? - PullRequest
33 голосов
/ 09 февраля 2010

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

Как изменить библиотеку, чтобы она была только заголовочной?

Ответы [ 4 ]

56 голосов
/ 09 февраля 2010

Вы можете использовать ключевое слово inline:

// header.hpp (included into multiple translation units)

void foo_bad() {} // multiple definitions, one in every translation unit :(

inline void foo_good() {} // ok :)

inline позволяет компоновщику просто выбрать одно определение и отбросить остальные.

(Таким образом, если эти определения на самом деле не совпадают, вы получите хорошую дозу неопределенного поведения ...!)


Кроме того, функции-члены, определенные в типе класса, неявно помечены inline:

struct myclass
{
    void i_am_inline_implicitly()
    {
        // because my definition is here
    }

    void but_i_am_not();
    void neither_am_i();
};

inline void myclass::but_i_am_not()
{
    // but that doesn't mean my definition cannot be explicitly inline
}

void myclass::neither_am_i()
{
    // but in this case, no inline for me :(
}
7 голосов
/ 09 февраля 2010

Используйте защиту заголовков, как предлагает Лиз, и не забудьте поставить "inline" перед вашими методами функций.

т.е.

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
    // Function body
    return retType;
}

#endif
4 голосов
/ 09 февраля 2010

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

0 голосов
/ 09 февраля 2010

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

...