Frequently Asked Questions - Informazioni sul linguaggio C
Domande inerenti messaggi tipici del compilatore gcc e problemi di C
Ho provato a compilare un mio programma in C ma il compilatore gcc al termine della compilazione mi segnala un avvertimento di questo tipo "nomefile.c:x:y warning: no newline at end of file". Cosa significa e come posso evitarlo?
Premesso che si tratta solo di un avvertimento e quindi non di un errore (infatti se non compaiono altre segnalazioni oltre a questa, il compilatore è riuscito ad eseguire per intero il suo lavoro ed a generare il file esegubile finale), si tratta di un problema decisamente marginale.
In sostanza il compilatore vi avverte semplicemente che il file sorgente che gli avete dato da elaborare (il cui nome è citato nell'avvertimento stesso ed è nomefile.c) non termina con una riga vuota (cosa che invece vorrebbe gcc). Per risolvere il "problema" ed eliminare il "fastidioso" messaggio di warning è sufficiente quindi rieditare il file sorgente incriminato e verificare che alla fine del file ci sia almeno una riga vuota (senza nessun carattere, nemmeno spazi o tab).
A seguito della compilazione del mio programma con il compilatore gcc, lo stesso mi segnala il messaggio "nomefile.c:x:y: warning unused variable 'nome'". Perchè?
Come per tutti gli avvertimenti (warnings), anche questo vi informa solamente di un potenziale problema (ma non è detto che lo sia davvero). Per altro si tratta di un warning di importanza bassa (leggibile solo se durante la compilazione si specifica un livello di dettaglio dei warning elevato, tipo -Wall).
Il concetto è semplicemente che gcc si è accorto che nel vostro programma è stata dichiarata e quindi definita una variabile di nome 'nome' che però poi non risulta usata in nessuna parte del programma stesso (e quindi inutile, ovvero uno spreco di memoria).
Soluzione: se la variabile effettivamente non serve, è sufficiente che rimuoviate dal sorgente la sua dichiarazione. Viceversa verificate accuratamente il file sorgente per scoprire dove avete scordato di fare uso della variabile stessa.
La compilazione del mio programma non va a buon fine ed ottengo un messaggio di errore di questo tipo: "nomefile.c:x:y: error: parse error before '/' token". Cosa vuole dire e come posso correggere il problema?
Si tratta di un messaggio di errore che si presenta quando si specifica come standard di compilazione il C89 ovvero l'ANSI (usando come opzioni di compilazione -ansi oppure -sdt=c89).
Con tutta probabilità avete infatti inserito dei commenti in linea (con la sintassi // commento) che però in standard C (ovvero lo standard C89) non sono permessi.
Soluzione: andate alla riga x del file nomefile.c e modificate il commento in linea (// seguito dal commento) in un commento racchiuso (commento racchiuso tra /* e */).
Ho provato a compilare un mio programma ma ottengo il seguente messaggio di errore: "nomefile.c:x:y: error: 'nome' undeclared (first use in this function)". Cosa vuole dire e come posso risolvere l'errore?
Si tratta di un errore molto comune e vuol dire semplicemente che il compilatore ha trovato almeno un posto nel vostro programma (riga x del file nomefile.c) in cui fate uso della variabile che si chiama 'nome', che però non è ancora mai stata dichiarata e quindi definita (entro lo scope di quella porzione di programma e precedentemente al suo uso). L'indicazione "(first use in this function)" serve unicamente per avvertire l'utente che il compilatore non vi mostra tutto l'elenco dei posti in cui la variabile 'nome' è stata usata (senza prima essere dichiarata e definita), ma solo il primo posto che incontra.
Soluzione: semplicemente dichiarare e quindi definire la variabile di nome 'nome' e di tipo opportuno (secondo le esigenze del problema che state risolvendo) prestando attenzione al posto in cui farete tale dichiarazione (scope di visibilità).
Compilando il mio programma con gcc ottengo il seguente messaggio di avvertimento: "nomefile.c:x:y: warning: implicit declaration of function 'nome_funzione'". Cosa significa e come posso evitare tale avvertimento?
Il concetto è che il compilatore ha trovato in riga x del file nomefile.c l'invocazione di una funzione 'nome_funzione' di cui al momento non conosce ancora nulla (perchè non ne ha trovato il prototipo).
In buona sostanza si tratta di un avvertimento che in gran parte dei casi non porta sostanziali problemi, poichè il compilatore è spesso in grado di "intuire" correttamente le informazioni di cui avrebbe bisogno.
Pur tuttavia è raccomandabile sempre porre rimedio a tale avvertimento ovvero fornire al compilatore (attraverso il file sorgente) le informazioni mancanti.
Soluzione: se la funzione 'nome_funzione' è una funzione "autoscritta" (ovvero l'avete realizzata voi ed il codice è all'interno del file stesso), è sufficiente ricordarsi di inserirne il prototipo in cima al file (ad esempio prima del corpo della funzione main). Se invece si tratta di una funzione di libreria (ad esempio 'printf', 'exit' o altre) è sufficiente ricordarsi di includere l'opportuno header file attraverso la direttiva di preprocessore in cima al file (ad es. "#include <stdio.h>" per le funzioni printf, scanf etc.).