Frage

Ich möchte eine Bibliothek verpacken ich arbeite als Kopf nur Bibliothek, um es einfacher für die Kunden zu bedienen. (Es ist klein und es gibt wirklich keinen Grund, es in eine separate Übersetzungseinheit zu setzen) aber ich kann einfach nicht meinen Code in Header setzen, weil diese C ++ ist eine Definitionsregel verstößt. (Unter der Annahme, dass die Bibliothek-Header wird in mehreren Übersetzungseinheiten eines Client-Projekt enthalten)

Wie man eine Bibliothek nicht ändern, um es nur-Header?

War es hilfreich?

Lösung

Sie können das inline Schlüsselwort verwenden:

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

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

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

inline ermöglicht es der Linker einfach eine Definition auswählen und den Rest verwerfen.

(Als solcher, wenn diese Definitionen eigentlich nicht übereinstimmen, erhalten Sie eine gute Dosis von undefiniertem Verhalten ...!)


Als Nebenelementfunktionen definiert innerhalb einer Klasse-Typ, werden implizit markiert 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 :(
}

Andere Tipps

Mit Kopfschutz wie Liz schlägt vor, und vergessen Sie nicht „inline“ vor Ihrer Funktion Methoden zu setzen.

dh

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

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

#endif

Außerdem glaube ich, werden Sie jegliche Verwendung von globalen Variablen oder statische Variablen in der Header-only-Bibliothek Code vermeiden müssen.

Mit Kopfschutz für die Teile, die an einem Ort zusammenstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top