Question

Je voudrais emballer une bibliothèque, je travaille en tant que bibliothèque d'en-tête seulement pour le rendre plus facile pour les clients à utiliser. (Il est petit et il n'y a vraiment aucune raison de le mettre dans une unité de traduction séparée) Cependant, je ne peux pas simplement mettre mon code en-têtes parce que cela constitue une violation de l 'une règle de définition C ++. (En supposant que l'en-tête de la bibliothèque est incluse dans plusieurs unités de traduction d'un projet de client)

Comment peut-on à une bibliothèque pour le faire en-tête uniquement?

Était-ce utile?

La solution

Vous pouvez utiliser le mot-clé inline:

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

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

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

inline permet à l'éditeur de liens de simplement choisir une définition et jeter le reste.

(En tant que tel, si ces définitions ne correspondent pas en fait, vous obtenez une bonne dose de comportement non défini ...!)


Soit dit en passant, les fonctions membres définies dans un type de classe, sont implicitement marqués 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 :(
}

Autres conseils

gardes d'en-tête d'utilisation comme Liz suggère et ne pas oublier de mettre « en ligne » avant que vos méthodes de fonction.

soit

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

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

#endif

En outre, je pense que vous devez éviter toute utilisation de variables globales ou des variables statiques dans votre tête seule bibliothèque de codes.

gardes d'en-tête d'utilisation pour les pièces qui compilent en un seul endroit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top