Como faço para criar uma única header-biblioteca?
-
19-09-2019 - |
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?
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.