Curs 02

Deși nu doriți să le ignorați, avertismentele compilatorului nu sunt suficient de grave pentru a nu vă compila programul. De obicei, un avertisment de compilator este un semn că ceva ar putea merge prost în timpul rulării. Cum știe acest compilator? Trebuie să fi făcut erori tipice despre care știe compilatorul. Un exemplu tipic este utilizarea operatorului de atribuire = în locul operatorului de egalitate == în interiorul expresiei. Compilatorul dvs. vă poate avertiza și despre utilizarea variabilelor care nu au fost inițializate și a altor erori similare. În mod obișnuit, puteți seta nivelul alertelor pentru compilatorul dvs. - am setat-o ​​la cel mai înalt nivel, astfel încât avertismentele compilatorului să nu devină erori în programul executabil (erori de execuție).







Cu toate acestea, avertismentele compilatorului nu ar trebui să oprească programul dvs. (cu excepția cazului în care îi spuneți compilatorului să trateze avertismentele ca erori), astfel încât acestea probabil nu sunt la fel de grave ca erorile.

Erori sunt condiții care împiedică finalizarea compilației fișierelor.

Erori de compilatoare sunt limitate la fișierele cu cod sursă individuale și sunt rezultatul "erorilor de sintaxă". De fapt, aceasta înseamnă că ați făcut ceva ce compilatorul nu poate înțelege. De exemplu, expresia pentru (;) este incorectă din punct de vedere sintactic, deoarece bucla ar trebui să aibă întotdeauna trei părți. Deși compilatorul se aștepta la un punct și virgulă, poate aștepta o expresie condiționată, astfel încât mesajul de eroare pe care îl primiți ar putea fi ceva de genul:

linia 13, paranteză neașteptată ")"

Rețineți că erorile compilatorului includ întotdeauna numărul liniei în care a fost detectată eroarea.

Chiar dacă ați finalizat cu succes procesul de compilare, este posibil să întâlniți erori de linker. Eroarele linkerului, spre deosebire de erorile compilatorului, nu au nimic de-a face cu o sintaxă greșită. În schimb, erorile de linker sunt de obicei probleme cu găsirea definiției funcțiilor, structurilor, claselor sau variabilelor globale care au fost declarate, dar nu definite, în fișierul sursă. De regulă, aceste erori vor arăta astfel:

nu a putut găsi definiția pentru X

De obicei, procesul de compilare începe cu o serie de erori de compilare și avertismente, iar dacă le corectați, veți întâlni erori de linker. În schimb, aș repara mai întâi erorile de compilare și apoi erorile linkerului.

Erori de compilatoare - de unde să începem?

Dacă vă confruntați cu o listă de cincizeci sau șaizeci de erori și avertismente, va fi dificil să determinați de unde să începeți. Cel mai bun loc, totuși, se află în partea de sus a listei. De fapt, aproape niciodată nu începeți să remediați erorile de la sfârșitul fișierului până la începutul acestuia pentru un singur motiv simplu: nu știți dacă sunt cu adevărat erori!

poate duce la un număr mare de erori, inclusiv mesajele:

străine "int" ignorate

Este vorba de un singur personaj! Cel mai bine este să începeți de la vârf.

Analiza mesajului de eroare

Cele mai multe mesaje de la compilator vor consta în cel puțin patru lucruri:

tipul mesajului - avertisment sau eroare;

Fișierul sursă în care a apărut eroarea;

o scurtă descriere a ceea ce nu funcționează corect.

Ieșirea programului g ++ pentru programul de mai sus ar putea arăta astfel (rezultatele dvs. pot fi diferite dacă utilizați un alt compilator):







foo.cc:7: eroare: punct și virgulă lipsesc după declarația struct

foo.cc este numele fișierului. 7 este numărul liniei și este clar că aceasta este o eroare. Un mesaj scurt aici este foarte util, deoarece arată exact ceea ce nu este corect. Rețineți totuși că mesajul este semnificativ numai în contextul programului. Nu vă spune care structură nu are virgulă.

Mai incomprehensibil este un alt mesaj de eroare din aceeași încercare de compilare:

străine "int" ignorate

Programatorul trebuie să afle de ce sa întâmplat asta. Rețineți din nou că această eroare a fost cauzată de o problemă la începutul programului, nu în linia 8, ci mai devreme, atunci când structura nu are punct și virgulă. Din fericire, este clar că definiția funcției pentru foo a fost ok, ne spune că bug-ul trebuie să fie în altă parte a programului. De fapt, ar trebui să existe în program înainte - nu veți primi un mesaj de eroare care să indice o eroare de sintaxă înainte de linia pe care a apărut eroarea.

Acesta este principiul călăuzitor pentru calcularea erorilor compilatorului: dacă aveți dubii, uitați-vă la program înainte. Din moment ce erorile de sintaxă pot avea mai târziu consecințe grave, este posibil ca compilatorul să specifice un număr de linie în care nu există de fapt nici o eroare de sintaxă!

Va fi mult mai rău dacă compilatorul nu vă spune ce sa întâmplat mai devreme în program. Chiar prima eroare de compilatoare primită poate fi asociată cu mai multe linii înainte de avertizarea specificată.

Procesarea mesajelor incomprehensibile sau ciudate

Există câteva tipuri de erori de compilator deosebit de complexe. Prima este o variabilă nedeclarată, pe care credeți că ați declarat-o. De multe ori, puteți specifica exact unde a fost declarată variabila! Problema este că de multe ori o variabilă este pur și simplu scrisă cu o eroare. Din păcate, este destul de greu de văzut, deoarece de obicei citim ceea ce așteptăm și nu ceea ce există de fapt. În plus, există și alte motive pentru care aceasta poate fi o problemă - de exemplu, probleme cu vizibilitatea!

Al doilea mesaj incomprehensibil:

sfârșitul neașteptat al fișierului

În cele din urmă, dacă mesajul este incomprehensibil, abordați problema, gândindu-vă cum compilatorul încearcă să interpreteze fișierul. Poate fi dificil atunci când începeți, dar dacă acordați atenție mesajelor și încercați să înțelegeți ce ar putea însemna acestea, vă veți obișnui rapid cu modelele generale.

În cele din urmă, dacă nu funcționează nimic, puteți rescrie mereu câteva linii de cod pentru a elimina orice erori de sintaxă ascunse pe care nu le puteți vedea. Acest lucru poate fi periculos, deoarece puteți rescrie o secțiune gresită, dar vă poate ajuta.

După ce ați rezolvat definitiv toate erorile de sintaxă, ați luat un pui de somn, câteva gustări și ați pregătit moral pentru compilarea corectă a programului, puteți totuși să vă confruntați cu erori de linker. Ele sunt adesea dificil de repara, pentru că ele nu sunt neapărat rezultatul a ceea ce este scris în programul tău. Voi descrie pe scurt tipurile tipice de erori de linker pe care le puteți aștepta și câteva modalități de a le rezolva.

S-ar putea să aveți probleme cu modul în care ați configurat compilatorul. De exemplu, chiar dacă includeți fișierele cu antet adecvate pentru toate funcțiile dvs., trebuie să furnizați link-ul dvs. cu calea corectă la biblioteca care are implementarea reală. În caz contrar, veți primi un mesaj de eroare:

Uneori apar erori minore atunci când link-ul raportează mai mult de o definiție pentru o clasă, o funcție sau o variabilă. Această problemă poate apărea din mai multe motive: în primul rând, un obiect poate avea două definiții - de exemplu, două variabile globale sunt declarate ca variabile externe care trebuie să fie disponibile în afara fișierului sursă. Acest lucru se aplică atât funcțiilor, cât și variabilelor, iar acest lucru se întâmplă adesea. Pe de altă parte, uneori aceasta este o problemă cu directivele de legătură; de câteva ori am văzut că oamenii includ mai multe copii ale aceluiași fișier obiect în procesul de legare. Și bingo, ai mai multe definiții. O manifestare tipică a acestei probleme este că o serie de funcții au mai multe definiții.

Ultimul tip de eroare de linker ciudat este mesajul

referință nedefinită la principalele

Dimpotrivă, acest lucru înseamnă că linkerul a încercat să creeze un fișier executabil și nu a putut înțelege unde este localizată funcția principal (). Acest lucru se poate întâmpla dacă ați uitat să activați funcția principală sau dacă încercați să compilați cod care nu a fost niciodată un executabil separat (de exemplu, dacă ați încercat să compilați o bibliotecă).

Selectarea compilatoarelor (IDE)

dows: Codul :: Blocuri cu cod Mingw :: Blocuri este de asemenea disponibil pe Linux

Microsoft Visual C ++

g ++ este un compilator C ++ care vine cu cele mai multe distribuții * NIX

Apple XCode. XCode - IDE pentru dezvoltarea de programe pe OS X sau iPhone.

Qt SDK este un pachet de dezvoltare software pentru mai multe platforme.







Articole similare

Trimiteți-le prietenilor: