c errors undefined reference
eksempler på testscenarier fra slutt til slutt
Denne opplæringen beskriver de kritiske feilene som programmerere ofte støter på i C ++ som udefinert referanse, en segmenteringsfeil (kjernedumpet) og uløst eksternt symbol:
Vi vil diskutere de viktigste feilene vi ofte støter på i C ++ som faktisk er like kritiske. Bortsett fra systemet og semantiske feil og unntak som oppstår fra tid til annen, får vi også andre kritiske feil som påvirker driften av programmer.
Disse feilene oppstår for det meste mot slutten av programmet ved kjøretid. Noen ganger gir programmet riktig utgang, og da oppstår feilen.
=> Besøk her for å lære C ++ fra grunnen.
Hva du vil lære:
Viktige C ++ feil
I denne opplæringen vil vi diskutere tre typer feil som er kritiske sett fra C ++ programmerers synspunkt.
- Udefinert referanse
- Segmenteringsfeil (kjernedumpet)
- Uløst eksternt symbol
Vi vil diskutere de mulige årsakene til hver av disse feilene og sammen med de forholdsregler vi kan ta som programmerer for å forhindre disse feilene.
La oss begynne!!
Udefinert referanse
En “udefinert referanse” -feil oppstår når vi har en referanse til objektnavnet (klasse, funksjon, variabel, etc.) i programmet vårt, og koblingen kan ikke finne definisjonen når den prøver å søke etter det i alle de tilknyttede objektfilene og -bibliotekene. .
Når koblingen ikke finner definisjonen av et koblet objekt, utsteder den således en 'udefinert referanse' -feil. Som klart fra definisjonen, oppstår denne feilen i de senere stadiene av koblingsprosessen. Det er forskjellige grunner som forårsaker en 'udefinert referanse' -feil.
Vi diskuterer noen av disse grunnene nedenfor:
# 1) Ingen definisjon gitt for objektet
Dette er den enkleste grunnen til å forårsake en 'udefinert referanse' -feil. Programmereren har rett og slett glemt å definere objektet.
Vurder følgende C ++ - program. Her har vi bare spesifisert prototypen på funksjonen og deretter brukt den i hovedfunksjonen.
#include int func1(); int main() { func1(); }
Produksjon:
Så når vi kompilerer dette programmet, blir linkerfeilen som sier 'udefinert referanse til 'func1 ()'' gitt.
For å bli kvitt denne feilen, korrigerer vi programmet som følger ved å gi definisjonen av funksjonen func1. Nå gir programmet riktig utgang.
#include using namespace std; int func1(); int main() { func1(); } int func1(){ cout<<'hello, world!!'; }
Produksjon:
Hei Verden!!
# 2) Feil definisjon (signaturer stemmer ikke overens) av brukte objekter
Nok en årsak til 'udefinert referanse' -feil er når vi spesifiserer feil definisjoner. Vi bruker ethvert objekt i programmet vårt, og definisjonen er noe annerledes.
Vurder følgende C ++ - program. Her har vi ringt til func1 (). Prototypen er int func1 (). Men definisjonen samsvarer ikke med prototypen. Som vi ser inneholder definisjonen av funksjonen en parameter til funksjonen.
Dermed når programmet er kompilert, er kompileringen vellykket på grunn av prototypen og funksjonen samtalematch. Men når koblingen prøver å koble funksjonsanropet med definisjonen, finner den problemet og utsteder feilen som 'udefinert referanse'.
#include using namespace std; int func1(); int main() { func1(); } int func1(int n){ cout<<'hello, world!!'; }
Produksjon:
For å forhindre slike feil kryssjekker vi bare om definisjonene og bruken av alle objektene stemmer overens i programmet vårt.
# 3) Objektfiler er ikke riktig koblet
Dette problemet kan også føre til feilen 'udefinert referanse'. Her kan det hende vi har mer enn én kildefiler, og vi kan kompilere dem uavhengig. Når dette er gjort, blir ikke objektene koblet riktig, og det resulterer i “udefinert referanse”.
Vurder følgende to C ++ - programmer. I den første filen bruker vi funksjonen “print ()” som er definert i den andre filen. Når vi kompilerer disse filene hver for seg, gir den første filen 'udefinert referanse' for utskriftsfunksjonen, mens den andre filen gir 'udefinert referanse' for hovedfunksjonen.
int print(); int main() { print(); }
Produksjon:
int print() { return 42; }
Produksjon:
Måten å løse denne feilen på er å kompilere begge filene samtidig ( For eksempel, ved å bruke g ++).
Bortsett fra årsakene som allerede er diskutert, kan 'udefinert referanse' også forekomme på grunn av følgende årsaker.
# 4) Feil prosjekttype
Når vi spesifiserer feil prosjekttyper i C ++ IDEer som visual studio og prøver å gjøre ting som prosjektet ikke forventer, så får vi 'udefinert referanse'.
# 5) Ingen bibliotek
Hvis en programmerer ikke har spesifisert bibliotekstien riktig eller helt glemt å spesifisere den, får vi en 'udefinert referanse' for alle referansene programmet bruker fra biblioteket.
# 6) Avhengige filer kompileres ikke
En programmerer må sørge for at vi kompilerer alle avhengighetene til prosjektet på forhånd, slik at når vi kompilerer prosjektet, finner kompilatoren alle avhengighetene og kompilerer vellykket. Hvis noen avhengighetene mangler, gir kompilatoren 'udefinert referanse'.
Bortsett fra årsakene som er diskutert ovenfor, kan feilen 'udefinert referanse' oppstå i mange andre situasjoner. Men poenget er at programmereren har fått ting galt, og for å forhindre denne feilen, bør de rettes.
beste programmet for å gjenopprette slettede filer
Segmenteringsfeil (kjernedumpet)
Feilen 'segmenteringsfeil (kjernedumpet)' er en feil som indikerer minnekorrupsjon. Det oppstår vanligvis når vi prøver å få tilgang til et minne som ikke tilhører programmet.
Her er noen av årsakene som forårsaker feil i segmenteringsfeil.
# 1) Endring av den konstante strengen
Tenk på følgende program der vi har erklært en konstant streng. Så prøver vi å endre denne konstante strengen. Når programmet kjøres, får vi feilen vist i utdataene.
#include int main() { char *str; //constant string str = 'STH'; //modifying constant string *(str+1) = 'c'; return 0; }
Produksjon:
# 2) Dereferencing Pointer
En peker må peke på et gyldig minneplassering før vi refererer til det. I programmet nedenfor ser vi at pekeren peker mot NULL, noe som betyr at minneplasseringen den peker på er 0, dvs. ugyldig.
Derfor når vi refererer til den i neste linje, prøver vi faktisk å få tilgang til den ukjente minneplasseringen. Dette resulterer faktisk i en segmenteringsfeil.
#include using namespace std; int main() { int* ptr = NULL; //here we are accessing unknown memory location *ptr = 1; cout << *ptr; return 0; }
Produksjon:
Segmenteringsfeil
Neste program viser en lignende sak. I dette programmet peker ikke pekeren på gyldige data. En ikke-initialisert peker er like god som NULL, og peker derfor også på ukjent minneplassering. Dermed når vi prøver å gjenskille det, resulterer det i en segmenteringsfeil.
#include using namespace std; int main() { int *p; cout<<*p; return 0; }
Produksjon:
beste serverne å spille på wow
Segmenteringsfeil
For å forhindre slike feil, må vi sørge for at pekervariablene i programmet alltid peker på gyldige minneplasseringer.
# 3) Stack Overflow
Når vi har rekursive samtaler i programmet vårt, spiser de opp alt minnet i stabelen og får stabelen til å renne over. I slike tilfeller får vi segmenteringsfeilen, ettersom minne om stacking også er en slags minnekorrupsjon.
Tenk på programmet nedenfor der vi beregner faktoren til et tall rekursivt. Merk at grunntilstanden vår tester om tallet er 0 og deretter returnerer 1. Dette programmet fungerer perfekt for positive tall.
Men hva skjer når vi faktisk overfører et negativt tall til en faktorfunksjon? Vel, ettersom basistilstanden ikke er gitt for de negative tallene, vet ikke funksjonen hvor den skal stoppes, og resulterer dermed i en stabeloverløp.
Dette vises i utgangen nedenfor som gir segmenteringsfeil.
#include using namespace std; int factorial(int n) { if(n == 0) { return 1; } return factorial(n-1) * n; } int main() { cout< Produksjon:
Segmenteringsfeil (kjernedumpet)
For å fikse denne feilen, endrer vi litt grunntilstanden og spesifiserer også saken for negative tall som vist nedenfor.
#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:'< Produksjon:
Faktorisk utgang: 1
Nå ser vi at segmenteringsfeilen blir tatt vare på og programmet fungerer bra.
Uløst eksternt symbol
Det uløste eksterne symbolet er en linkerfeil som indikerer at den ikke kan finne symbolet eller dets referanse under koblingsprosessen. Feilen ligner på 'udefinert referanse' og utstedes om hverandre.
Vi har gitt to tilfeller nedenfor der denne feilen kan oppstå.
# 1) Når vi refererer til en strukturvariabel i programmet som inneholder et statisk medlem.
#include struct C { static int s; }; // int C::s; // Uncomment the following line to fix the error. int main() { C c; C::s = 1; }
Produksjon:

I det ovennevnte programmet har struktur C et statisk medlem som ikke er tilgjengelig for de eksterne programmene. Så når vi prøver å tildele den en verdi i hovedfunksjonen, finner ikke lenker symbolet og kan resultere i et 'uløst eksternt symbol' eller 'udefinert referanse'.
Måten å fikse denne feilen på er å eksplisitt omfatte variabelen ved å bruke ‘::’ utenfor hovedstrømmen før du bruker den.
# 2) Når vi har referert til eksterne variabler i kildefilen, og vi ikke har koblet filene som definerer disse eksterne variablene.
Denne saken er demonstrert nedenfor:
#include #include using namespace std; extern int i; extern void g(); void f() { i++; g(); } int main() {}
Produksjon:

Generelt sett, i tilfelle et 'uløst eksternt symbol', finner den kompilerte koden for et objekt som en funksjon ikke et symbol som det refererer til, kanskje fordi symbolet ikke er definert i objektfilene eller noen av bibliotekene. spesifisert til linkeren.
Konklusjon
I denne opplæringen diskuterte vi noen store feil i C ++ som er kritiske og som kan påvirke programflyten og til og med kan føre til et programkrasj. Vi utforsket alt om segmenteringsfeil, uløst eksternt symbol og udefinert referanse i detalj.
Selv om disse feilene kan oppstå når som helst, vet vi av årsakene vi diskuterte at vi lett kan forhindre dem ved å utvikle vårt program nøye.
=> Les gjennom Easy C ++ Training Series.
Anbefalt lesing