Comment puis-je créer une bibliothèque d'en-tête seulement?
-
19-09-2019 - |
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?
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.