Come faccio a creare una libreria di testa-solo?
-
19-09-2019 - |
Domanda
Mi piacerebbe confezionare una libreria su cui sto lavorando come una libreria di testa solo per rendere più facile per i clienti di utilizzare. (E 'piccola e non c'è davvero alcun motivo per metterlo in un'unità di traduzione separata) Tuttavia, non posso semplicemente mettere il mio codice nelle intestazioni perché questo viola regola una definizione C ++' s. (Supponendo che l'intestazione libreria è inclusa in più unità di traduzione di un progetto client)
Come si fa a modificare una libreria per renderlo solo intestazioni?
Soluzione
È possibile utilizzare la parola chiave inline
:
// header.hpp (included into multiple translation units)
void foo_bad() {} // multiple definitions, one in every translation unit :(
inline void foo_good() {} // ok :)
inline
consente al linker di scegliere semplicemente uno definizioni e scartare il resto.
(Come tale, se queste definizioni in realtà non corrispondono, si ottiene una buona dose di comportamento non definito ...!)
Come inline
parte, le funzioni membro definite all'interno di una classe di tipo, sono implicitamente marcati:
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 :(
}
Altri suggerimenti
guardie Usa intestazione come suggerisce Liz e non dimenticate di mettere "in linea" prima che i vostri metodi di funzione.
es
#ifndef MY_HEADER_H_
#define MY_HEADER_H_
inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
// Function body
return retType;
}
#endif
Inoltre, penso che è necessario evitare qualsiasi uso di variabili globali o variabili statiche nella tua intestazione di sola-libreria di codici.
guardie Usa intestazione per le parti che compilano in un unico luogo.