Error de definición múltiple en C++
Cuando una función o variable tiene varias definiciones en varios archivos de origen, el procedimiento de vinculación da como resultado un error de definición múltiple. Para garantizar la uniformidad y la precisión del programa, el enlazador solo espera una definición en todos los archivos de origen.
Por lo general, el error se ve así:
Error: definición múltiple de 'function_name'Es crucial que cada desarrollador de C ++ comprenda la causa de este error y sepa cómo solucionarlo.
Factores que conducen a errores de definición múltiple en C++
Los errores de definición múltiple pueden ocurrir en su código C ++ por varias razones como se discute a continuación:
1: Definiciones múltiples de la misma función o variable en un archivo de origen
Si define accidentalmente la misma función o variable varias veces en el mismo archivo fuente, encontrará un error de definición múltiple.
2: función o variable definida en un archivo de encabezado
Cuando se declara una función o variable en un archivo de encabezado y ese archivo de encabezado se hace referencia por numerosos archivos fuente, cualquier archivo fuente que tenga un encabezado también contendrá una definición para la función o variable. Esto genera el error de múltiples definiciones.
3: Declarando la misma función o variable varias veces en el mismo archivo fuente
Si declara accidentalmente la misma función o variable varias veces en el mismo archivo fuente, encontrará un error de definición múltiple al vincular. Esto se debe a que el enlazador solo espera una definición para cada función o variable en todos los archivos de origen.
Corrige error con múltiples definiciones de una función en c++
Las siguientes técnicas se pueden usar para corregir errores de definición múltiples en C ++:
1: utilizar prototipos de funciones y variables externas
Una técnica para corregir errores de definición múltiple en C ++ es declarar una función o variable utilizando prototipos de funciones o variables externas, en lugar de especificarlos en un archivo de encabezado. Al hacerlo, la función o variable solo se definirá una vez en el archivo fuente, evitando así el error.
La siguiente es una sintaxis de código para la solución anterior.
// encabezado.HEn la sintaxis anterior, la función sub se declara en el archivo de encabezado utilizando la palabra clave extern, que indica que se define en otro lugar. La definición real se proporciona en el archivo fuente. El #ifndef Header_h y #Define Header_h Las líneas incluyen guardias que aseguran que el archivo de encabezado se incluya solo una vez en el mismo archivo fuente para evitar redefinir la función.
2: utilizar funciones o variables estáticas
Si una función o variable solo se usa en un archivo fuente, declara como estática. Esto restringe su alcance al archivo fuente actual, y el enlazador no lo considerará durante la vinculación. Al hacerlo, se asegura de que la función o la variable solo se define una vez y no se pueda acceder desde otros archivos.
Declarar una función o variable como estática restringe su alcance al archivo fuente actual y garantiza que solo se define una vez, lo que hace que su código sea más modular y más fácil de mantener
Además, si tiene múltiples funciones en diferentes archivos, puede utilizarlas fácilmente en cualquier otro proyecto.
Considere la siguiente sintaxis del código como ejemplo:
// Funciones.CPPEn la sintaxis anterior, la "estático" La palabra clave se usa para definir una función llamada "Once_used_function". Esta función solo se puede acceder dentro del mismo archivo fuente y no se puede acceder desde otros archivos que están vinculados con este archivo de origen. Esto asegura que la función solo se define una vez y no se pueda modificar o acceder accidentalmente desde otras partes del programa.
3: Implementar funciones en línea
Considere el uso de funciones en línea para funciones cortas frecuentemente llamadas. Esto eliminará la necesidad de una definición separada, ya que el compilador puede reemplazar la llamada de función con el código de la función directamente.
Considere la siguiente sintaxis del código como ejemplo:
// encabezado.HEn la sintaxis anterior, la palabra clave "en línea" se usa para definir una función llamada "sub", que toma dos argumentos enteros y devuelve su diferencia. Al definir esta función como en línea, el compilador sustituirá la llamada de función con el código de función real en el momento de la compilación, eliminando la necesidad de una definición de función separada.
4: utilizar espacios de nombres
Al usar espacios de nombres, puede evitar que el enlazador encuentre múltiples definiciones con el mismo nombre. Los espacios de nombres proporcionan una forma de declaraciones y definiciones relacionadas con el grupo en un solo alcance llamado, lo que hace que sea más fácil organizar y administrar grandes bases de código.
Considere la siguiente sintaxis del código como ejemplo:
// Source_code_1.CPPEn la sintaxis anterior, dos archivos fuente diferentes tienen una función llamada "sub" con la misma firma. Para evitar conflictos de nombres, cada función se define dentro de un espacio de nombres separado: "Source_code_1" y "Source_code_2". De esta manera, se puede acceder a las funciones desde sus respectivos espacios de nombres sin causar conflictos de nombres. Al llamar a la función desde otras partes de la base de código, deberá especificar el espacio de nombres para indicar a qué versión de la función desea llamar.
Conclusión
Cuando los programadores y desarrolladores definen y usan la misma función dos veces, el sistema se confunde, lo que lleva al error típico de múltiples definiciones de funciones de C ++. Debido a que C ++ puede mostrar errores y defectos inesperados en archivos que parecen ser correctos, los desarrolladores disfrutan de una experiencia dinámica trabajando con él. Por lo tanto, esta guía explicó las múltiples definiciones de error de las funciones en C ++, suministró la sintaxis de la solución y depuró el error.