Razão um
Não há declaração de função, e a função é definida após a função principal
Causa dois
Arquivos de cabeçalho são referenciados ciclicamente, considere a ordem de inclusão
ou uso
#ifndef CAPITAL_FILENAME
#define CAPITAL_FILENAME
// main body
#endif /* CAPITAL_FILENAME */
Razão três
A declaração da função do arquivo de cabeçalho e os parâmetros de definição da função são diferentes, como
O arquivo de cabeçalho declara void test (const char * buf), mas é escrito como void test (char * buf);
Razão quatro
O tipo de parâmetro usado pela função é um tipo personalizado (como uma estrutura), e a definição de um tipo personalizado está entre a declaração da função e a definição da função, porque na declaração da função, a estrutura não
Não é definida e não é reconhecida como uma estrutura pelo sistema. Quando a função é definida posteriormente, a estrutura já está definida e o sistema a reconhece como uma estrutura, o que faz com que o sistema pense que a declaração e a definição usam parâmetros diferentes tipos, portanto, o problema acima;
Razão 5
No Linux, ao compilar o arquivo de cabeçalho, um arquivo intermediário pré-compilado (.h.gch) aparecerá. Quando todo o arquivo for compilado novamente, se o arquivo (.h.gch) existir, o arquivo (.h) será ser usado diretamente .gch) em vez de compilar o arquivo .h. Neste momento, se você alterar o arquivo .h e continuar a compilar, isso causará inconsistências entre a declaração e a definição. Embora a declaração e a definição sejam consistentes em o arquivo, mas, na verdade, o sistema não usa o arquivo (.h) que você alterou durante a compilação, mas usa diretamente o arquivo .h.gch que você compilou antes da modificação (este erro é geralmente difícil de encontrar, se você encontrá-lo em seu próprio diretório. h.gch deve ser atualizado a tempo).