Pergunta

Eu gostaria de empacotar uma biblioteca que estou trabalhando como um cabeçalho somente biblioteca para tornar mais fácil para os clientes para uso. (É pequeno e não há realmente nenhuma razão para colocá-lo em uma unidade de tradução separado) No entanto, eu não posso simplesmente colocar o meu código nos cabeçalhos porque isso viola regra de uma definição do C ++. (Assumindo que o cabeçalho da biblioteca está incluído em várias unidades de tradução de um projeto de cliente)

Como se modificar uma biblioteca para torná-lo header-only?

Foi útil?

Solução

Você pode usar a palavra-chave 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 o vinculador para simplesmente escolher uma definição e descartar o resto.

(Como tal, se essas definições na verdade, não corresponder, você tem uma boa dose de comportamento indefinido ...!)


Como um inline lado, as funções de membro definidas dentro de um tipo de classe, são marcadas implicitamente:

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

Outras dicas

Use guardas de cabeçalho como Liz sugere e não se esqueça de colocar "inline" antes de seus métodos de função.

ie

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

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

#endif

Além disso, eu acho que você vai precisar para evitar qualquer uso de variáveis ??globais ou variáveis ??estáticas em seu código de cabeçalho-only-biblioteca.

Use guardas de cabeçalho para as partes que compilação em um só lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top