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

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

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

33
задан Billy ONeal 7 June 2013 в 19:33
поделиться

4 ответа

Вы можете использовать ключевое слово 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 :(
}
57
ответ дан 27 November 2019 в 18:03
поделиться

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

т.е.

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

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

#endif
7
ответ дан 27 November 2019 в 18:03
поделиться

Нет необходимости использовать селекторы # id / .class . Вместо этого можно использовать

[id=test] {}
[class|=testing] {}

, которые эквивалентны.

Класс AFAIK представляет собой вещь, специфичную для HTML, и поскольку пространства имен XML полностью безумны, атрибуты XHTML не входят в пространство имен XHTML! Тебе, наверное, не повезло с этим.

Для идентификатора можно попробовать xml: id , но я не проверял, действительно ли его поддерживает что-либо.

Если вы хотите сопоставить элементы пространства имен, это возможно с Пространствами имен CSS :

@namespace xf "http://www.w3.org/2002/xforms";
xf|group {}
-121--4998340-

Интересный вопрос.

В блоге группы разработчиков SQL Programming and API здесь содержится хорошая статья, в которой перечислены обходные решения, 2008 до SQL:

  1. используйте подсказку RECOMPILE, чтобы запрос перекомпилировался каждый раз, когда
  2. unparameterise запрос
  3. дает конкретные значения в подсказке OPTIMIZE FOR
  4. force use определенного индекса
  5. используйте руководство по плану

Что приводит меня к этой статье, в которой упоминается обходной путь использования локальных параметров и как он генерирует план выполнения на основе статистики Насколько этот процесс похож на новый подсказку OPTIMIZER FOR UNKNOWN, я не знаю. Моя догадка в том, что это разумный обходной путь.

-121--3003474-

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

0
ответ дан 27 November 2019 в 18:03
поделиться

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

5
ответ дан 27 November 2019 в 18:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: