Pregunta

Me gustaría empaquetar una biblioteca que estoy trabajando como una biblioteca sólo de encabezado para que sea más fácil para los clientes a utilizar. (Es pequeño y no hay realmente ninguna razón para ponerlo en una unidad de traducción separada) Sin embargo, no puedo simplemente poner mi código en las cabeceras porque esto viola una regla de definición de C ++ s. (Suponiendo que la cabecera de la biblioteca se incluye en múltiples unidades de traducción de un proyecto de cliente)

¿Cómo se puede modificar una biblioteca para que sea sólo de encabezado?

¿Fue útil?

Solución

Puede utilizar la palabra clave inline:

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

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

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

inline permite que el enlazador tomar simplemente una definición y desechar el resto.

(Como tal, si esas definiciones en realidad no coinciden, se obtiene una buena dosis de comportamiento indefinido ...!)


Como inline un lado, las funciones miembro definidas dentro de un tipo de clase, están marcados implícitamente:

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 :(
}

Otros consejos

guardias Uso de cabecera como Liz sugiere y no se olvide de poner "en línea" antes de que sus métodos de la función.

es decir,

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

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

#endif

Además, creo que necesita para evitar cualquier uso de variables globales o variables estáticas en el encabezado de sólo-biblioteca de código.

Los guardias Uso de cabecera para las partes que se compilan en un solo lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top