Ciao e bentornato.
In questa conferenza, voglio solo esaminare alcuni compilatori e avvertenze comuni.
Abbiamo parlato di alcuni dei problemi comuni di c.
Ma a volte non sai nemmeno di avere quegli errori nel tuo programma quando
il compilatore sta cercando di dirtelo.
Gli errori e gli avvisi del compilatore tendono ad essere davvero criptici per i nuovi programmatori.
Potrebbero dirti che ti manca un punto e virgola, ma dice che la fine dell'istruzione è irraggiungibile.
E per qualcuno di nuovo, potrebbero anche non sapere cosa significa.
Quindi ci vuole molta pratica nello scrivere molto codice
e nel decifrare alcuni di questi avvisi del compilatore nel tempo.
Ma vorrei avvisarti prima.
Quindi alcuni dei problemi comuni che hai visto nella lezione
precedente, descriverò effettivamente alcuni degli avvisi e degli errori del compilatore e cosa dirà effettivamente.
È molto, molto importante dirti di capire cosa ti sta dicendo il compilatore.
Se il compilatore ti sta dicendo che gli errori, ma non lo
capisci, ci vorrà molto più tempo per correggere quel codice.
Ma se vedi l'errore e sai esattamente cosa sta dicendo, puoi andare
a risolverlo in pochissimo tempo.
Ricordo che ero in laboratorio quando ho iniziato a programmare per
la prima volta e mi mancava
un punto e virgola, qualcosa di molto comune. E il compilatore mi direbbe che mi manca un
punto e virgola, ma
non lo saprei, direbbe solo la fine dell'istruzione irraggiungibile, e io
direi, cosa significa, cos'è un'affermazione. Sarei molto confuso.
Ecco perché volevo darti alcuni suggerimenti su ciò che il compilatore sta effettivamente cercando di dirti.
Quindi è molto difficile capire di cosa si lamenta il compilatore.
Decifrare questi messaggi a volte
è molto confuso.
Quindi è necessario comprendere questi errori del compilatore per risolverli, piuttosto semplice.
E il compilatore sta facendo metà del lavoro per te.
Sta controllando la sintassi, ti dice esattamente cosa c'è che non
va, quindi dovresti usarlo a tuo vantaggio.
Ma a volte è difficile capire esattamente cosa sta dicendo, soprattutto se sei
nuovo e non capisci parte della terminologia.
Il compilatore prende le decisioni su come tradurre il codice che
il programmatore non ha scritto nel codice.
Questo è conveniente per il programma e il compilatore, in modo che
possa essere scritto in modo più succinto.
E solo i programmatori esperti traggono vantaggio da questa funzione.
Quindi quello che ti sto dicendo è che quando compili,
dovresti sempre usare l'opzione dash wall.
Questo accenderà tutto.
Quindi a volte una caratteristica più avanzata è che in
realtà tirerai fuori
alcune cose, avrai la traduzione un po 'più efficiente.
Ma quando lo
aggiungi, il programma viene compilato in modo diverso.
Di conseguenza, potresti avere avvisi nel tuo codice di cui non sei a conoscenza.
Quindi il motivo per cui ti dico è che vuoi sempre compilare con una certa
opzione, che è l'opzione dash wall.
E tu in realtà per impostazione predefinita è attivato nei blocchi di codice.
E questo ti avviserà di tutti i casi in cui il
compilatore sta facendo cose che non conosci.
Inoltre attiverà tutti gli avvisi, ti
darà molte informazioni, è un'opzione del compilatore molto utile.
Una volta attivata questa opzione, puoi provare ad
aiutarti a capire meglio cosa ti sta dicendo il compilatore.
Quindi il compilatore ti mostrerà due
tipi di problemi. Uno è un errore.
Ciò impedirà effettivamente la creazione del programma.
Hai un errore di sintassi e il programma non può essere compilato.
Nessun lavoro
eseguibile ricreato e. Di solito, quando vedi errori dal compilatore, vuoi
sempre concentrarti su quel primo errore.
Questo è l'errore più affidabile
perché alcuni degli altri errori potrebbero essere il risultato di quel primo errore.
Quindi concentrati sempre su quel primo errore. Correggi prima gli errori in alto,
quindi compila di nuovo e verifica se gli altri errori scompaiono.
Avvertenze. Gli avvisi sono messaggi che il
compilatore mostra per situazioni speciali e in cui è stato rilevato un qualche tipo di anomalia.
Sono errori non fatali. Quindi verrà creato l'eseguibile.
Ma è ancora qualcosa che dovresti aggiustare.
C'è un avvertimento per un motivo. O stai facendo qualcosa di
sbagliato o potrebbe causare un problema in futuro.
Quindi vuoi correggere sempre tutti i tuoi avvisi.
E compilando con l'opzione dash wall, non consideri
il programma corretto fino a quando tutti gli avvisi non sono stati eliminati.
Quindi la compilazione non fallirà. Questo è il motivo per
cui ti dico di usare questa opzione oltre a vedere tutto ciò che sta succedendo dal compilatore.
Quindi alcuni dei messaggi del compilatore più comuni che incontrerai e questo
sarà direttamente correlato ad alcuni dei problemi c più comuni che
abbiamo menzionato in precedenza.
Se una variabile non è dichiarata, vedrai prima questa variabile di messaggio non
dichiarata utilizzando questa funzione.
Questo è uno dei più comuni e solitamente più facile da rilevare.
E poi mostrerà anche il simbolo prima
di questo messaggio.
Fondamentalmente dirà che stai
cercando di usare questa variabile, ma non l'hai mai effettivamente dichiarata.
Sappiamo che quando dichiari una variabile, specifichi il tipo di dati.
Non puoi semplicemente firmare dati su variabili che non esistono.
Una dichiarazione implicita di avviso di funzione, questa è correlata alle dichiarazioni di funzione.
È quando stai cercando di chiamare una funzione, ma
se alla funzione non è associata alcuna implementazione. Non hai incluso l'intestazione o
non l'hai dichiarata. Quindi non sa dove si trova,
e non sa come viene dichiarata la funzione, non conosce gli argomenti, non conosce il valore di ritorno.
Non ha informazioni sulla funzione stessa?
Per risolvere questo problema, dichiarare sempre un prototipo di funzione in alto.
Un altro avvertimento è che dirà che il controllo dell'avviso raggiunge la fine della funzione
non void, questo accadrà quando una funzione è stata definita come restituendo un risultato non void,
ma non c'è alcuna istruzione return inclusa nella funzione.
Quindi hai dimenticato di restituire i dati.
O la funzione è definita in modo errato in cui è necessario rimuovere il
tipo di dati prima della dichiarazione della funzione o si
è dimenticato di aggiungere l'istruzione return. Uno degli altri deve
essere cambiato per correggere questo avviso.
Ma vedi come questo sia un avvertimento. Puoi ancora compilare lì, ma
questo potrebbe davvero causare problemi di taglio nel tuo programma.
Se ti aspetti che una funzione restituisca qualcosa e non lo fa, allora vuoi correggere
i tuoi avvisi variabile inutilizzata un altro avviso comune.
Viene stampato dal compilatore quando viene dichiarata una variabile, ma non viene mai utilizzata.
Non dovresti dichiarare una variabile se non la
usi, quindi rimuovi quella dichiarazione.
Tendo a ottenerli un po 'quando eseguo alcune delle mie demo
perché lascio variabili che non uso mai.
O quando stavo dimostrando come dichiarare una variabile e poi l'ho
compilata per mostrarti che è stata compilata, ricevevo un avviso che diceva che non era mai stata usata.
Quindi va bene perché stavo dimostrando qualcosa. Ma rimuovi le
tue variabili se non vengono utilizzate. Non c'è bisogno di dichiarare.
Riferimento non definito a. Questo accade nella fase di collegamento.
Quindi ricorda il compilatore o la fase di compilazione, verrà compilato.
In primo luogo, eseguirà il preprocessore, quindi genererà i file oggetto e quindi prenderà quei
file oggetto e li collegherà insieme per creare un programma completo.
Quindi durante la fase
di collegamento, deve risolvere eventuali dipendenze esterne.
O in particolare tutte le funzioni che stai chiamando, devono
essere implementate da qualche parte.
Quindi, se non ha quel file oggetto, ti darà questo problema.
Stai cercando di richiamare una funzione, ma non abbiamo il codice per essa.
Quindi devi assicurarti di collegarti a
questo file.
Di solito il collegamento
avverrà per te, ma in GCC puoi semplicemente fare l'opzione trattino l
per aggiungere il file di collegamento. Quindi, se stai usando una funzione nel
file di intestazione matematica, ma non stai collegando al file dell'oggetto matematico, riceverai questo errore.
E succede anche se hai definito dall'utente e non hai
incluso un file sorgente c.
Quindi hai più file sorgente c.
Uno dei file sorgente c sta implementando questa funzione.
Un altro file sorgente c include l'intestazione e
lo chiama, ma
non hai mai compilato l'altro file sorgente c che ha l'implementazione, vedrai
questo errore.
Quindi assicurati di portare quel file sorgente, assicurati di portare
tutti i file sorgente della libreria standard se ne hai bisogno esplicitamente di solito, non devi farlo.
Un altro errore comune è quando si creano conflitti di tipi per.
Questo è quando hai effettivamente definito o dichiarato un prototipo di funzione e poi quando sei andato
a implementarlo, non era lo stesso di come lo avevi dichiarato.
Quindi, ad esempio, il prototipo ha un tipo di risultato e un nome di parentesi per i parametri e
quindi un punto e virgola.
E poi, quando definisci l'implementazione,
hai un'intestazione della funzione effettiva diversa.
Hai un diverso tipo di ritorno o hai un diverso numero di parametri.
E questo sta dicendo bene, ehi, hai
questa dichiarazione di una funzione. E poi quando vai a implementarlo in basso, è completamente diverso.
Quindi c'è una mancata corrispondenza.
E questo ti mostrerà effettivamente sulla linea che il conflitto appare nella
definizione precedente che ha causato la contraddizione.
Quindi nell'implementazione di solito è dove ti mostra la riga perché di
solito dichiari le tue funzioni in alto.
Errori di runtime. Gli errori di runtime sono problemi
nel codice che si verificano quando esegui il programma, non quando lo compili.
Quindi questi di solito
sono arresti anomali o sono errori non fatali in
cui sei fuori dai limiti dell'array o qualcosa del genere.
È quando il programma è in esecuzione, hai una sorta di errore logico.
Quindi l'esecuzione dei programmi c può terminare bruscamente con un arresto anomalo quando viene rilevato un
errore di runtime, qualcosa che non può gestire. C'è una corruzione della memoria,
come ho detto.
Gli errori fuori limite di solito causano il crash dei programmi.
Di solito, quello che vedrai è un errore di segmentazione.
E l'errore di segmentazione in realtà non ti dice nulla.
Quindi in genere ciò che si desidera fare per diagnosticare ulteriormente questo problema è
guardare lo stack di chiamate, come ho
detto prima che il programma si arresti in modo anomalo facendo un
passo per riga per vedere quale riga sta causando l'arresto.
Puoi ottenere lo stack di chiamate se c'è un file core, che ho menzionato prima.
E poi dallo stack di chiamate, puoi vedere quale linea si sta bloccando.
O meglio ancora, esegui il debugger, passo riga per riga e poi quando esegui una riga,
debugger, vedrai il programma andare in crash e potrai identificarlo in quel modo.
Quindi questi sono solo ancora alcuni suggerimenti sugli
errori del compilatore, sugli avvisi e sui messaggi e su come interpretarli.
In realtà ci
sono collegamenti online. Oppure, se
fai google, ti dirà ogni singolo errore del compilatore e avvertimento
che può essere prodotto e in realtà darà una definizione
del motivo per cui è stato prodotto
e qual è il problema essenzialmente.
Perché ancora una volta, quegli errori di compilazione possono essere molto criptici.
E anche una sola parola diceva
un controllo irraggiungibile. Sai da quella descrizione necessariamente a
meno che tu non l'abbia sperimentato, ciò significa che non restituisci mai qualcosa da una funzione.
Ma se lo fai, uno dei modi migliori per trovare e
risolvere i problemi nel tuo programma quando hai errori del compilatore e non capisci
quel compilatore, cercalo su google. E in genere ciò che accadrà è che andrai a stack overflow.
E ti dirà ehi questo è il tuo errore, ecco come
lo risolvi. Lo faccio ancora oggi.
Ho programmato in c per 15 anni, ma ci sono
ancora momenti in cui incontro cose e mi chiedo cosa significhi esattamente.
E lo cercherò su google, prenderò il compilatore, lo metterò tra virgolette e
mi dirà esattamente cosa sta succedendo.
Stack overflow è davvero un ottimo sito web.
E può davvero risparmiare molto tempo nel
processo di debug. Non cercare di indovinare quando vedi compilatori o avvisi.
Quel compilatore sta cercando di dirti qualcosa e individuerà esattamente cosa sta succedendo.
Quindi, se lo capisci, sarai in grado di risolvere il tuo problema molto, molto più velocemente.
E se non è qualcosa che ti
è familiare, vai a Stack Overflow o vai su un sito Web che li descrive
tutti e puoi decifrarlo in questo modo.
Spero che questo sia stato utile. Grazie.