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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

(Как таковые, если эти определения фактически не совпадают, вы получаете хорошую дозу поведения undefined...!)


В качестве сторонних функций-членов, определенных в классе, неявно отмечены 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 :(
}

Ответ 2

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

ie

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

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

#endif

Ответ 3

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

Ответ 4

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