Erro Linker em ter função não inline definido no arquivo de cabeçalho?
-
21-08-2019 - |
Pergunta
função Non linha definida no arquivo de cabeçalho com guardas
#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H
void foo()
{
//something
}
#endif
Resulta em erro vinculador: Já definido no someother.obj arquivo Fazendo a função inline funciona bem, mas eu não sou capaz de entender por que a função já está erroring em primeiro caso.
Solução
Se o cabeçalho está incluído em mais de um arquivo de origem e a função não está marcado como "inline" você terá mais de uma definição. A incluem guardas só evitar múltiplas inclusões no mesmo arquivo fonte.
Outras dicas
Você está violando a definição da regra . Se você quiser definir uma função diretamente no cabeçalho, você deve marcá-lo como inline
- que permitirá que a função a ser definida várias vezes. Observe também que inline
não tem outro significado, particularmente ele não forçar o compilador para chamadas em linha (ao contrário da crença popular).
Uma vez que não está em linha, cada unidade de tradução terá sua própria cópia da função resultando na função que está sendo definido várias vezes.