c errors undefined reference
millor emmagatzematge al núvol per a fitxers grans
Aquest tutorial detalla els errors crítics que sovint es troben els programadors a C ++ com ara Referència sense definir, un error de segmentació (nucli abocat) i un símbol extern sense resoldre:
Discutirem els errors més importants que sovint trobem a C ++ que són igualment crítics. A part del sistema i dels errors i excepcions semàntics que es produeixen de tant en tant, també obtenim altres errors crítics que afecten el funcionament dels programes.
Aquests errors es produeixen principalment cap al final del programa en temps d'execució. De vegades, el programa proporciona una sortida adequada i es produeix l’error.
=> Visiteu aquí per aprendre C ++ des de zero.
Què aprendreu:
Errors importants de C ++
En aquest tutorial, analitzarem tres tipus d’errors que són crítics des del punt de vista de qualsevol programador de C ++.
- Referència sense definir
- Error de segmentació (nucli abocat)
- Símbol extern sense resoldre
Analitzarem les possibles causes de cadascun d’aquests errors i juntament amb les precaucions que podem prendre com a programador per prevenir aquests errors.
Comencem!!
Referència sense definir
Es produeix un error de 'Referència sense definir' quan tenim una referència al nom de l'objecte (classe, funció, variable, etc.) al nostre programa i l'enllaçador no troba la seva definició quan intenta cercar-lo a tots els fitxers i biblioteques d'objectes enllaçats. .
Per tant, quan l'enllaçador no troba la definició d'un objecte enllaçat, emet un error de 'referència no definida'. Com es desprèn de la definició, aquest error es produeix en les fases posteriors del procés d’enllaç. Hi ha diversos motius que causen un error de 'referència no definida'.
A continuació, comentem alguns d’aquests motius:
# 1) No es proporciona cap definició per a l'objecte
Aquesta és la raó més simple per provocar un error de 'referència no definida'. El programador simplement s’ha oblidat de definir l’objecte.
Penseu en el següent programa C ++. Aquí només hem especificat el prototip de funció i després l’hem utilitzat a la funció principal.
#include int func1(); int main() { func1(); }
Sortida:
Per tant, quan compilem aquest programa, s’emet l’error de l’enllaçador que diu “referència indefinida a‘ func1 () ’”.
Per tal d’eliminar aquest error, corregim el programa de la següent manera proporcionant la definició de la funció func1. Ara el programa proporciona la sortida adequada.
#include using namespace std; int func1(); int main() { func1(); } int func1(){ cout<<'hello, world!!'; }
Sortida:
Hola món!!
# 2) Definició incorrecta (les signatures no coincideixen) dels objectes utilitzats
Una altra causa de l'error de 'referència no definida' és quan especifiquem definicions incorrectes. Utilitzem qualsevol objecte del nostre programa i la seva definició és diferent.
Penseu en el següent programa C ++. Aquí hem trucat a func1 (). El seu prototip és int func1 (). Però la seva definició no coincideix amb el seu prototip. Com veiem, la definició de la funció conté un paràmetre de la funció.
Així, quan es compila el programa, la compilació té èxit a causa de la coincidència de trucades de prototips i funcions. Però quan l'enllaçador intenta enllaçar la trucada de funció amb la seva definició, troba el problema i emet l'error com a 'referència no definida'.
#include using namespace std; int func1(); int main() { func1(); } int func1(int n){ cout<<'hello, world!!'; }
Sortida:
Per tal d’evitar aquests errors, simplement comprovem si les definicions i l’ús de tots els objectes coincideixen al nostre programa.
# 3) Els fitxers d’objectes no s’enllacen correctament
Aquest problema també pot donar lloc a l'error de 'referència no definida'. Aquí és possible que tinguem més d’un fitxer font i que puguem compilar-los de manera independent. Quan es fa això, els objectes no s'enllacen correctament i es tradueix en una 'referència no definida'.
Penseu en els dos programes C ++ següents. Al primer fitxer, fem servir la funció “print ()” que es defineix al segon fitxer. Quan compilem aquests fitxers per separat, el primer fitxer proporciona 'referència no definida' per a la funció d'impressió, mentre que el segon fitxer proporciona 'referència no definida' per a la funció principal.
int print(); int main() { print(); }
Sortida:
int print() { return 42; }
Sortida:
La forma de resoldre aquest error consisteix a compilar els dos fitxers simultàniament ( Per exemple, mitjançant l’ús de g ++).
A part de les causes ja comentades, també es pot produir una 'referència no definida' per les raons següents.
# 4) Tipus de projecte incorrecte
Quan especifiquem tipus de projecte equivocats en IDE C ++ com l'estudi visual i intentem fer coses que el projecte no espera, obtindrem una 'referència no definida'.
# 5) Sense biblioteca
Si un programador no ha especificat correctament el camí de la biblioteca o s’ha oblidat completament d’especificar-lo, obtindrem una 'referència no definida' per a totes les referències que utilitza el programa de la biblioteca.
# 6) Els fitxers dependents no es compilen
Un programador ha de garantir que compilem totes les dependències del projecte prèviament, de manera que quan compilem el projecte, el compilador troba totes les dependències i es compila amb èxit. Si falta alguna de les dependències, el compilador proporciona 'referència no definida'.
A part de les causes comentades anteriorment, l'error de 'referència no definida' es pot produir en moltes altres situacions. Però la conclusió és que el programador s’ha equivocat i, per evitar aquest error, s’haurien de corregir.
millor eina de neteja per a Windows 10
Error de segmentació (nucli abocat)
L'error 'error de segmentació (nucli abocat)' és un error que indica un deteriorament de la memòria. Normalment es produeix quan intentem accedir a una memòria que no pertany al programa.
Aquests són alguns dels motius que causen un error de segmentació.
# 1) Modificació de la cadena constant
Penseu en el programa següent en què hem declarat una cadena constant. Després intentem modificar aquesta cadena constant. Quan s’executa el programa, obtenim l’error que es mostra a la sortida.
#include int main() { char *str; //constant string str = 'STH'; //modifying constant string *(str+1) = 'c'; return 0; }
Sortida:
# 2) Punter de referència
Un punter ha d’assenyalar una ubicació de memòria vàlida abans de desferir-la. Al programa següent, veiem que el punter apunta a NULL, cosa que significa que la ubicació de la memòria que apunta és 0, és a dir, no és vàlida.
Per tant, quan la desferenciem a la següent línia, en realitat estem intentant accedir a la seva ubicació de memòria desconeguda. De fet, això provoca un error de segmentació.
#include using namespace std; int main() { int* ptr = NULL; //here we are accessing unknown memory location *ptr = 1; cout << *ptr; return 0; }
Sortida:
Falla de segmentació
El següent programa mostra un cas similar. En aquest programa, el punter no apunta a dades vàlides. Un punter no inicialitzat és tan bo com NULL i, per tant, també apunta a una ubicació de memòria desconeguda. Per tant, quan intentem desreferenciar-la, resulta un error de segmentació.
#include using namespace std; int main() { int *p; cout<<*p; return 0; }
Sortida:
Falla de segmentació
Per evitar aquests errors, hem d'assegurar-nos que les nostres variables de punter del programa apunten sempre a ubicacions de memòria vàlides.
# 3) Desbordament de pila
Quan tenim trucades recursives al nostre programa, mengen tota la memòria de la pila i fan que la pila es desbordi. En aquests casos, obtenim l’error de segmentació, ja que quedar-se sense memòria de pila també és una mena de corrupció de la memòria.
Penseu en el programa següent on calculem recursivament el factorial d’un nombre. Tingueu en compte que la nostra condició base prova si el número és 0 i després retorna 1. Aquest programa funciona perfectament per a nombres positius.
Però, què passa quan realment passem un nombre negatiu a una funció factorial? Bé, com que la condició base no es dóna per als nombres negatius, la funció no sap on aturar-se i, per tant, resulta un desbordament de la pila.
Això es mostra a la sortida següent que dóna un error de segmentació.
#include using namespace std; int factorial(int n) { if(n == 0) { return 1; } return factorial(n-1) * n; } int main() { cout< Sortida:
Error de segmentació (nucli abocat)
Ara, per corregir aquest error, canviem lleugerament la condició base i també especifiquem el cas de nombres negatius com es mostra a continuació.
#include using namespace std; int factorial(int n) { // What about n <0? if(n <= 0) { return 1; } return factorial(n-1) * n; } int main() { cout<<'Factorial output:'< Sortida:
Sortida factorial: 1
Ara veiem que l’error de segmentació s’aconsegueix i el programa funciona bé.
Símbol extern sense resoldre
El símbol extern no resolt és un error d'enllaç que indica que no pot trobar el símbol ni la seva referència durant el procés d'enllaç. L'error és similar a la 'referència no definida' i s'emet indistintament.
A continuació, hem donat dos casos en què es pot produir aquest error.
# 1) Quan remetem una variable d’estructura al programa que conté un membre estàtic.
#include struct C { static int s; }; // int C::s; // Uncomment the following line to fix the error. int main() { C c; C::s = 1; }
Sortida:

Al programa anterior, l'estructura C té un membre estàtic que no és accessible per als programes externs. Per tant, quan intentem assignar-li un valor a la funció principal, l’enllaçador no troba el símbol i pot resultar en un “símbol extern no resolt” o una “referència no definida”.
La manera de corregir aquest error consisteix a abastar explícitament la variable mitjançant ‘::’ fora de la pàgina principal abans d’utilitzar-la.
quina diferència hi ha entre unió exterior i unió esquerra
# 2) Quan tenim referències de variables externes al fitxer font i no hem enllaçat els fitxers que defineixen aquestes variables externes.
Aquest cas es demostra a continuació:
#include #include using namespace std; extern int i; extern void g(); void f() { i++; g(); } int main() {}
Sortida:

En general, en cas d'un 'símbol extern no resolt', el codi compilat per a qualsevol funció com ara objecte no troba un símbol al qual fa referència, potser perquè aquest símbol no està definit als fitxers d'objectes ni a cap de les biblioteques. especificat a l'enllaçador.
Conclusió
En aquest tutorial, hem comentat alguns errors importants en C ++ que són crítics i poden afectar el flux del programa i fins i tot poden provocar un bloqueig de l'aplicació. Hem explorat detalladament tot sobre la falla de segmentació, el símbol extern sense resoldre i la referència sense definir.
Tot i que aquests errors es poden produir en qualsevol moment, per les causes que hem comentat sabem que podem evitar-los fàcilment desenvolupant amb cura el nostre programa.
=> Llegiu la sèrie de formació Easy C ++.
Lectura recomanada