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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top