Erro de definição múltipla em C++
Quando uma função ou variável tem várias definições em vários arquivos de origem, o procedimento de vinculação resulta em um erro de definição múltipla. Para garantir a uniformidade e a precisão do programa, o vinculador espera apenas uma definição em todos os arquivos de origem.
Normalmente, o erro se parece com o seguinte:
Erro: Definição múltipla de 'function_name'É crucial para cada desenvolvedor de C ++ compreender a causa desse erro e saber como consertá -lo.
Fatores que levam a vários erros de definição em C++
Múltiplos erros de definição podem acontecer no seu código C ++ por vários motivos, conforme discutido abaixo:
1: múltiplas definições da mesma função ou variável em um arquivo de origem
Se você definir acidentalmente a mesma função ou variável várias vezes no mesmo arquivo de origem, você encontrará um erro de definição múltipla.
2: função ou variável definida em um arquivo de cabeçalho
Quando uma função ou variável é declarada em um arquivo de cabeçalho e esse arquivo de cabeçalho é referenciado por vários arquivos de origem, qualquer arquivo de origem que possui um cabeçalho também conterá uma definição para a função ou variável. Isso gera o erro de várias definições.
3: declarando a mesma função ou variável várias vezes no mesmo arquivo de origem
Se você declarar acidentalmente a mesma função ou variável várias vezes no mesmo arquivo de origem, encontrará um erro de definição múltipla ao vincular. Isso ocorre porque o vinculador espera apenas uma definição para cada função ou variável em todos os arquivos de origem.
Corrija o erro com várias definições de uma função em C++
As seguintes técnicas podem ser usadas para corrigir vários erros de definição no C ++:
1: Utilize protótipos de função e variáveis externas
Uma técnica para corrigir vários erros de definição em C ++ é declarar uma função ou variável usando protótipos de função ou variáveis externas, em vez de especificá -las em um arquivo de cabeçalho. Ao fazer isso, a função ou variável será definida apenas uma vez no arquivo de origem, evitando assim o erro.
A seguir, é apresentada uma sintaxe de código para a solução acima.
// cabeçalho.hNa sintaxe acima, a função sub é declarado no arquivo de cabeçalho usando a palavra -chave externa, o que indica que ela é definida em outro lugar. A definição real é então fornecida no arquivo de origem. O #ifndef header_h e #Define header_h As linhas incluem guardas que garantem que o arquivo de cabeçalho esteja incluído apenas uma vez no mesmo arquivo de origem para evitar redefinir a função.
2: Utilize funções estáticas ou variáveis
Se uma função ou variável for usada apenas em um arquivo de origem, declare -o como estático. Isso restringe seu escopo ao arquivo de origem atual, e o vinculador não o considerará durante a ligação. Ao fazer isso, você garante que a função ou variável seja definida apenas uma vez e não pode ser acessada de outros arquivos.
Declarar uma função ou variável como estática restringe seu escopo ao arquivo de origem atual e garante que ele seja definido apenas uma vez, tornando seu código mais modular e fácil de manter
Além disso, se você tiver várias funções em diferentes arquivos, poderá utilizá -los facilmente em qualquer outro projeto.
Considere a seguinte sintaxe de código como exemplo:
// funções.cppNa sintaxe acima, a "estático" A palavra -chave é usada para definir uma função chamada “Antes_used_function”. Esta função só pode ser acessada dentro do mesmo arquivo de origem e não pode ser acessada de outros arquivos que estão vinculados a este arquivo de origem. Isso garante que a função seja definida apenas uma vez e não possa ser modificada ou acessada acidentalmente em outras partes do programa.
3: Implementar funções embutidas
Considere usar funções embutidas para frequentemente chamadas funções curtas. Isso eliminará a necessidade de uma definição separada, pois o compilador pode substituir a chamada de função pelo código da função diretamente.
Considere a seguinte sintaxe de código como exemplo:
// cabeçalho.hNa sintaxe acima, a palavra -chave "em linha" é usada para definir uma função chamada "sub", que leva dois argumentos inteiros e retorna sua diferença. Ao definir essa função como embutida, o compilador substituirá a chamada de função pelo código de função real no momento da compilação, eliminando a necessidade de uma definição de função separada.
4: Utilize namespaces
Usando namespaces, você pode impedir que o vinculador encontre várias definições com o mesmo nome. Os namespaces fornecem uma maneira de agrupar declarações e definições em um único escopo nomeado, facilitando a organização e o gerenciamento de grandes bases de código.
Considere a seguinte sintaxe de código como exemplo:
// fonte_code_1.cppNa sintaxe acima, dois arquivos de origem diferentes têm uma função chamada "sub" com a mesma assinatura. Para evitar conflitos de nomeação, cada função é definida dentro de um espaço de nome separado: "fonte_code_1" e "fonte_code_2". Dessa forma, as funções podem ser acessadas em seus respectivos espaços para nome sem causar conflitos de nomeação. Ao chamar a função de outras partes da base de código, você precisaria especificar o espaço para nome para indicar qual versão da função você deseja chamar.
Conclusão
Quando programadores e desenvolvedores definem e usam a mesma função duas vezes, o sistema fica confuso, levando ao erro típico de múltiplas definições de funções C ++. Como o C ++ pode mostrar erros e defeitos inesperados em arquivos que parecem estar corretos, os desenvolvedores desfrutam de uma experiência dinâmica trabalhando com ele. Portanto, este guia explicou o erro de múltiplas definições de funções em C ++, forneceu a sintaxe da solução e depurou o erro.