c errors undefined reference
Tento výukový program podrobně popisuje kritické chyby, se kterými se programátoři často setkávají v C ++, jako je nedefinovaná reference, porucha segmentace (vyřazeno jádro) a nevyřešený externí symbol:
Budeme diskutovat o nejdůležitějších chybách, se kterými se v C ++ často setkáváme a které jsou skutečně stejně kritické. Kromě systémových a sémantických chyb a výjimek, které se čas od času vyskytnou, dostaneme také další kritické chyby, které ovlivňují běh programů.
jak udělat falešný e-mail
Tyto chyby se většinou vyskytují ke konci programu za běhu. Někdy program poskytuje správný výstup a pak dojde k chybě.
=> Navštivte zde a dozvíte se C ++ od nuly.
Co se naučíte:
Důležité chyby C ++
V tomto tutoriálu probereme tři typy chyb, které jsou kritické z pohledu programátora v C ++.
- Nedefinovaný odkaz
- Porucha segmentace (jádro vyhozeno)
- Nevyřešený externí symbol
Budeme diskutovat o možných příčinách každé z těchto chyb a spolu s opatřeními, která můžeme přijmout jako programátor, abychom těmto chybám zabránili.
Začněme!!
Nedefinovaný odkaz
Chyba „Nedefinovaná reference“ nastane, když máme v našem programu odkaz na název objektu (třída, funkce, proměnná atd.) A linker nemůže najít svou definici, když se ji pokusí vyhledat ve všech propojených souborech a knihovnách objektů .
Když tedy linker nemůže najít definici propojeného objektu, vydá chybu „nedefinovaný odkaz“. Jak je zřejmé z definice, k této chybě dochází v pozdějších fázích procesu propojení. Existuje mnoho důvodů, které způsobí chybu „nedefinovaného odkazu“.
Níže uvádíme některé z těchto důvodů:
# 1) Pro objekt není poskytnuta žádná definice
Toto je nejjednodušší důvod, proč způsobit chybu „nedefinovaného odkazu“. Programátor jednoduše zapomněl definovat objekt.
Zvažte následující program C ++. Zde jsme určili pouze prototyp funkce a poté jsme ji použili v hlavní funkci.
#include int func1(); int main() { func1(); }
Výstup:
Když tedy kompilujeme tento program, dojde k chybě linkeru, která říká „nedefinovaný odkaz na„ func1 () “.
Abychom se této chyby zbavili, opravíme program následujícím způsobem poskytnutím definice funkce func1. Nyní program poskytuje příslušný výstup.
#include using namespace std; int func1(); int main() { func1(); } int func1(){ cout<<'hello, world!!'; }
Výstup:
Ahoj světe!!
# 2) Špatná definice (podpisy se neshodují) použitých objektů
Ještě další příčinou chyby „nedefinovaného odkazu“ je, když zadáme nesprávné definice. V našem programu používáme jakýkoli objekt a jeho definice je něco jiného.
Zvažte následující program C ++. Zde jsme zavolali na func1 (). Jeho prototyp je int func1 (). Jeho definice však neodpovídá jeho prototypu. Jak vidíme, definice funkce obsahuje parametr funkce.
Když je tedy program kompilován, kompilace je úspěšná z důvodu shody prototypu a volání funkce. Ale když se linker pokouší spojit volání funkce s jeho definicí, najde problém a vydá chybu jako „nedefinovaný odkaz“.
#include using namespace std; int func1(); int main() { func1(); } int func1(int n){ cout<<'hello, world!!'; }
Výstup:
Abychom takovým chybám zabránili, jednoduše zkontrolujeme, zda se definice a použití všech objektů v našem programu shodují.
# 3) Soubory objektů nejsou správně propojeny
Tento problém může také vést k chybě „nedefinovaného odkazu“. Zde můžeme mít více než jeden zdrojový soubor a můžeme je sestavit samostatně. Když to uděláte, objekty nebudou správně propojeny a výsledkem bude „nedefinovaný odkaz“.
Zvažte následující dva programy C ++. V prvním souboru využíváme funkci „print ()“, která je definována v druhém souboru. Když tyto soubory sestavujeme samostatně, první soubor poskytuje „nedefinovaný odkaz“ pro tiskovou funkci, zatímco druhý soubor dává „nedefinovaný odkaz“ pro hlavní funkci.
int print(); int main() { print(); }
Výstup:
int print() { return 42; }
Výstup:
Způsob, jak tuto chybu vyřešit, je kompilace obou souborů současně ( Například, pomocí g ++).
Kromě již diskutovaných příčin může dojít k „nedefinovanému odkazu“ také z následujících důvodů.
# 4) Špatný typ projektu
Když zadáme nesprávné typy projektů v C ++ IDE, jako je Visual Studio, a pokusíme se dělat věci, které projekt neočekává, dostaneme „nedefinovaný odkaz“.
# 5) Žádná knihovna
Pokud programátor nezadal cestu ke knihovně správně nebo ji zcela zapomněl specifikovat, získáme „nedefinovaný odkaz“ pro všechny odkazy, které program z knihovny použije.
# 6) Závislé soubory nejsou kompilovány
Programátor musí zajistit, abychom předem zkompilovali všechny závislosti projektu, aby při kompilaci projektu kompilátor našel všechny závislosti a úspěšně zkompiloval. Pokud některá ze závislostí chybí, překladač dá „nedefinovaný odkaz“.
Kromě výše popsaných příčin může k chybě „nedefinovaného odkazu“ dojít v mnoha dalších situacích. Závěrem ale je, že programátor udělal věci špatně a aby se této chybě zabránilo, měly by být opraveny.
kde je klíč zabezpečení sítě
Porucha segmentace (vyřazeno jádro)
Chyba „chyba segmentace (vyřazené jádro)“ je chyba, která indikuje poškození paměti. Obvykle k tomu dochází, když se pokoušíme přistupovat k paměti, která do programu nepatří.
Zde jsou některé z důvodů, které způsobují chybu poruchy segmentace.
# 1) Úprava konstantního řetězce
Zvažte následující program, ve kterém jsme deklarovali konstantní řetězec. Pak se pokusíme upravit tento konstantní řetězec. Když je program spuštěn, dostaneme chybu zobrazenou na výstupu.
#include int main() { char *str; //constant string str = 'STH'; //modifying constant string *(str+1) = 'c'; return 0; }
Výstup:
# 2) Dereferenční ukazatel
Ukazatel musí ukazovat na platné místo v paměti, než jej dereferenčním způsobem. V níže uvedeném programu vidíme, že ukazatel ukazuje na NULL, což znamená, že umístění paměti, na které ukazuje, je 0, tj. Neplatné.
Proto když to v dalším řádku dereferujeme, ve skutečnosti se pokoušíme získat přístup k jeho neznámému umístění v paměti. To skutečně vede k poruše segmentace.
#include using namespace std; int main() { int* ptr = NULL; //here we are accessing unknown memory location *ptr = 1; cout << *ptr; return 0; }
Výstup:
Porucha Segmentace
Následující program ukazuje podobný případ. V tomto programu také ukazatel neukazuje na platná data. Neinicializovaný ukazatel je stejně dobrý jako NULL, a proto také ukazuje na neznámé umístění paměti. Když se jej tedy pokusíme dereferovat, dojde k poruše segmentace.
#include using namespace std; int main() { int *p; cout<<*p; return 0; }
Výstup:
Porucha Segmentace
Abychom těmto chybám zabránili, musíme zajistit, aby naše proměnné ukazatele v programu vždy směřovaly na platná místa v paměti.
# 3) Přetečení zásobníku
Když máme v našem programu rekurzivní volání, pohltí veškerou paměť v zásobníku a způsobí přetečení zásobníku. V takových případech dostaneme chybu segmentace, protože vyčerpání paměti zásobníku je také druh poškození paměti.
Zvažte níže uvedený program, kde rekurzivně vypočítáme faktoriál čísla. Všimněte si, že naše základní podmínka testuje, zda je číslo 0, a poté vrátí 1. Tento program funguje perfektně pro kladná čísla.
Co se ale stane, když ve skutečnosti předáme záporné číslo faktoriální funkci? Jelikož základní podmínka není dána zápornými čísly, funkce neví, kde se má zastavit, a tak vede k přetečení zásobníku.
To se zobrazuje na výstupu níže, který způsobí poruchu segmentace.
#include using namespace std; int factorial(int n) { if(n == 0) { return 1; } return factorial(n-1) * n; } int main() { cout< Výstup:
Porucha segmentace (jádro vyhozeno)
Nyní, abychom tuto chybu opravili, mírně změníme základní podmínku a také zadáme případ pro záporná čísla, jak je znázorněno níže.
#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:'< Výstup:
Faktoriální výstup: 1
Nyní vidíme, že o poruchu segmentace je postaráno a program funguje dobře.
Nevyřešený externí symbol
Nevyřešený externí symbol je chyba linkeru, která naznačuje, že během procesu propojení nemůže najít symbol nebo jeho odkaz. Chyba je podobná jako „nedefinovaná reference“ a je vydávána zaměnitelně.
Níže jsme uvedli dva případy, kdy k této chybě může dojít.
# 1) Když odkazujeme na strukturní proměnnou v programu, která obsahuje statický člen.
#include struct C { static int s; }; // int C::s; // Uncomment the following line to fix the error. int main() { C c; C::s = 1; }
Výstup:

Ve výše uvedeném programu má struktura C statické členy, které nejsou přístupné vnějším programům. Když se jí tedy pokusíme přiřadit hodnotu v hlavní funkci, linker tento symbol nenajde a může mít za následek „nevyřešený externí symbol“ nebo „nedefinovaný odkaz“.
Způsob, jak tuto chybu opravit, je explicitně nastavit proměnnou pomocí ‘::‘ mimo hlavní před jejím použitím.
# 2) Když máme ve zdrojovém souboru odkazy na externí proměnné a nepropojili jsme soubory, které tyto externí proměnné definují.
Tento případ je ukázán níže:
#include #include using namespace std; extern int i; extern void g(); void f() { i++; g(); } int main() {}
Výstup:
otázky a odpovědi s technikem technické podpory

Obecně platí, že v případě „nevyřešeného externího symbolu“ kompilovaný kód pro jakoukoli funkci typu objektu nedokáže najít symbol, na který odkazuje, možná proto, že tento symbol není definován v souborech objektů ani v žádné z knihoven určeno linkeru.
Závěr
V tomto kurzu jsme diskutovali o některých hlavních chybách v C ++, které jsou kritické a mohou ovlivnit tok programu a mohou dokonce vést ke zhroucení aplikace. Podrobně jsme prozkoumali vše o poruše segmentace, nevyřešeném externím symbolu a nedefinovaném odkazu.
I když k těmto chybám může dojít kdykoli, z příčin, o kterých jsme hovořili, víme, že jim můžeme snadno zabránit pečlivým vývojem našeho programu.
=> Přečtěte si sérii školení Easy C ++.
Doporučené čtení