c errors undefined reference
cómo convertir un char en una cadena c ++
Este tutorial detalla los errores críticos que los programadores encuentran a menudo en C ++, como una referencia no definida, una falla de segmentación (núcleo descargado) y un símbolo externo no resuelto:
Discutiremos los errores más importantes que encontramos a menudo en C ++ que son igualmente críticos. Aparte de los errores semánticos y del sistema y las excepciones que ocurren de vez en cuando, también obtenemos otros errores críticos que afectan el funcionamiento de los programas.
Estos errores ocurren principalmente hacia el final del programa en tiempo de ejecución. A veces, el programa da una salida adecuada y luego ocurre el error.
=> Visite aquí para aprender C ++ desde cero.
Lo que vas a aprender:
Errores importantes de C ++
En este tutorial, discutiremos tres tipos de errores que son críticos desde el punto de vista de cualquier programador de C ++.
- Referencia indefinida
- Fallo de segmentación (núcleo volcado)
- Símbolo externo sin resolver
Discutiremos las posibles causas de cada uno de estos errores y junto con las precauciones que podemos tomar como programador para prevenir estos errores.
¡¡Empecemos!!
Referencia indefinida
Se produce un error de 'Referencia no definida' cuando tenemos una referencia al nombre del objeto (clase, función, variable, etc.) en nuestro programa y el vinculador no puede encontrar su definición cuando intenta buscarla en todos los archivos y bibliotecas de objetos vinculados. .
Por lo tanto, cuando el vinculador no puede encontrar la definición de un objeto vinculado, emite un error de 'referencia indefinida'. Como se desprende de la definición, este error se produce en las últimas etapas del proceso de vinculación. Hay varias razones que provocan un error de 'referencia indefinida'.
Discutimos algunas de estas razones a continuación:
# 1) No se proporciona una definición para el objeto
Ésta es la razón más simple para provocar un error de 'referencia indefinida'. El programador simplemente se olvidó de definir el objeto.
Considere el siguiente programa de C ++. Aquí solo hemos especificado el prototipo de función y luego lo usamos en la función principal.
|_+_|Producción:
Entonces, cuando compilamos este programa, se emite el error del vinculador que dice 'referencia indefinida a 'func1 ()''.
Para eliminar este error, corregimos el programa de la siguiente manera proporcionando la definición de la función func1. Ahora el programa da la salida apropiada.
|_+_|Producción:
¡¡Hola Mundo!!
# 2) Definición incorrecta (las firmas no coinciden) de los objetos utilizados
Otra causa más del error de “referencia indefinida” es cuando especificamos definiciones incorrectas. Usamos cualquier objeto en nuestro programa y su definición es algo diferente.
Considere el siguiente programa de C ++. Aquí hemos realizado una llamada a func1 (). Su prototipo es int func1 (). Pero su definición no coincide con su prototipo. Como vemos, la definición de la función contiene un parámetro para la función.
Por lo tanto, cuando se compila el programa, la compilación es exitosa debido a que el prototipo y la llamada de función coinciden. Pero cuando el enlazador intenta vincular la llamada a la función con su definición, encuentra el problema y emite el error como 'referencia indefinida'.
|_+_|Producción:
Por lo tanto, para evitar tales errores, simplemente verificamos si las definiciones y el uso de todos los objetos coinciden en nuestro programa.
# 3) Archivos de objeto no vinculados correctamente
Este problema también puede dar lugar al error de 'referencia indefinida'. Aquí, puede que tengamos más de un archivo fuente y podríamos compilarlos de forma independiente. Cuando se hace esto, los objetos no se vinculan correctamente y da como resultado una 'referencia indefinida'.
Considere los siguientes dos programas C ++. En el primer archivo, hacemos uso de la función 'print ()' que se define en el segundo archivo. Cuando compilamos estos archivos por separado, el primer archivo da 'referencia indefinida' para la función de impresión, mientras que el segundo archivo da 'referencia no definida' para la función principal.
|_+_|Producción:
|_+_|
Producción:
La forma de resolver este error es compilar ambos archivos simultáneamente ( Por ejemplo, utilizando g ++).
Aparte de las causas ya discutidas, la “referencia indefinida” también puede ocurrir debido a las siguientes razones.
# 4) Tipo de proyecto incorrecto
Cuando especificamos tipos de proyectos incorrectos en IDE de C ++ como Visual Studio e intentamos hacer cosas que el proyecto no espera, obtenemos una 'referencia indefinida'.
# 5) Sin biblioteca
Si un programador no ha especificado la ruta de la biblioteca correctamente o se ha olvidado por completo de especificarla, obtenemos una 'referencia indefinida' para todas las referencias que el programa utiliza de la biblioteca.
# 6) Los archivos dependientes no se compilan
Un programador tiene que asegurarse de que compilamos todas las dependencias del proyecto de antemano para que cuando compilemos el proyecto, el compilador encuentre todas las dependencias y compile correctamente. Si falta alguna de las dependencias, el compilador proporciona una 'referencia no definida'.
Aparte de las causas discutidas anteriormente, el error de “referencia indefinida” puede ocurrir en muchas otras situaciones. Pero la conclusión es que el programador se ha equivocado en las cosas y para evitar este error deben corregirse.
diferencias c vs c ++
Fallo de segmentación (núcleo volcado)
El error 'fallo de segmentación (núcleo volcado)' es un error que indica corrupción de memoria. Suele ocurrir cuando intentamos acceder a una memoria que no pertenece al programa en consideración.
Estas son algunas de las razones que causan un error de segmentación.
# 1) Modificar la cadena constante
Considere el siguiente programa en el que hemos declarado una cadena constante. Luego intentamos modificar esta cadena constante. Cuando se ejecuta el programa, obtenemos el error que se muestra en la salida.
|_+_|Producción:
# 2) Puntero de desreferenciación
Un puntero debe apuntar a una ubicación de memoria válida antes de eliminar la referencia. En el siguiente programa, vemos que el puntero apunta a NULL, lo que significa que la ubicación de memoria a la que apunta es 0, es decir, no válida.
Por lo tanto, cuando lo desreferenciamos en la siguiente línea, en realidad estamos tratando de acceder a su ubicación de memoria desconocida. De hecho, esto da como resultado una falla de segmentación.
|_+_|Producción:
Fallo de segmentación
El siguiente programa muestra un caso similar. En este programa también, el puntero no apunta a datos válidos. Un puntero no inicializado es tan bueno como NULL y, por lo tanto, también apunta a una ubicación de memoria desconocida. Por lo tanto, cuando intentamos desreferenciarlo, se produce una falla de segmentación.
|_+_|Producción:
Fallo de segmentación
Para evitar tales errores, tenemos que asegurarnos de que nuestras variables de puntero en el programa apunten siempre a ubicaciones de memoria válidas.
# 3) Desbordamiento de pila
Cuando tenemos llamadas recursivas en nuestro programa, se comen toda la memoria de la pila y hacen que la pila se desborde. En tales casos, obtenemos el error de segmentación ya que quedarse sin memoria de pila también es un tipo de corrupción de memoria.
cómo ver un archivo swf
Considere el siguiente programa en el que calculamos el factorial de un número de forma recursiva. Tenga en cuenta que nuestra condición base prueba si el número es 0 y luego devuelve 1. Este programa funciona perfectamente para números positivos.
Pero, ¿qué sucede cuando en realidad pasamos un número negativo a una función factorial? Bueno, como no se da la condición base para los números negativos, la función no sabe dónde detenerse y, por lo tanto, da como resultado un desbordamiento de pila.
Esto se muestra en la salida a continuación que da una falla de segmentación.
|_+_|Producción:
Fallo de segmentación (núcleo volcado)
Ahora, para corregir este error, cambiamos ligeramente la condición base y también especificamos el caso de los números negativos como se muestra a continuación.
|_+_|Producción:
Salida factorial: 1
Ahora vemos que la falla de segmentación se solucionó y el programa funciona bien.
Símbolo externo sin resolver
El símbolo externo no resuelto es un error del vinculador que indica que no puede encontrar el símbolo o su referencia durante el proceso de vinculación. El error es similar a 'referencia indefinida' y se emite indistintamente.
A continuación, proporcionamos dos casos en los que puede ocurrir este error.
# 1) Cuando nos referimos a una variable de estructura en el programa que contiene un miembro estático.
|_+_|Producción:
En el programa anterior, la estructura C tiene un miembro estático que no es accesible para los programas externos. Entonces, cuando intentamos asignarle un valor en la función principal, el vinculador no encuentra el símbolo y puede resultar en un 'símbolo externo sin resolver' o 'referencia indefinida'.
La forma de corregir este error es aplicar explícitamente el alcance de la variable usando ‘::’ fuera del main antes de usarlo.
# 2) Cuando tenemos referencias de variables externas en el archivo fuente, y no hemos vinculado los archivos que definen estas variables externas.
Este caso se demuestra a continuación:
|_+_|Producción:
En general, en el caso de un 'símbolo externo no resuelto', el código compilado para cualquier función como objeto no encuentra un símbolo al que hace referencia, tal vez porque ese símbolo no está definido en los archivos de objeto o en ninguna de las bibliotecas. especificado al enlazador.
Conclusión
En este tutorial, discutimos algunos errores importantes en C ++ que son críticos y pueden afectar el flujo del programa e incluso pueden resultar en un bloqueo de la aplicación. Exploramos en detalle todo acerca de la falla de segmentación, el símbolo externo no resuelto y la referencia indefinida.
Aunque estos errores pueden ocurrir en cualquier momento, por las causas que discutimos sabemos que podemos prevenirlos fácilmente desarrollando cuidadosamente nuestro programa.
=> Lea la serie de formación Easy C ++.