Il codice funziona ancora senza includere (Dev-C ++ di Bloodshed)
-
06-07-2019 - |
Domanda
Attualmente sto imparando e sperimentando C e sto usando DEV-C ++ di Bloodshed come IDE.
Ora, ho appena capito che il seguente pezzo di codice (così com'è ... no include o niente) viene compilato ed eseguito:
main ()
{
printf("%d", strlen("hello"));
}
Ora, se non sbaglio, non dovrebbero essere inclusi in questa fonte due file di intestazione affinché funzioni? stdio.h
e string.h
... ma come puoi vedere, non li ho aggiunti e il codice è ancora stato compilato ed eseguito correttamente.
La mia lamentela è che desidero che il compilatore sia "rigoroso" perché poiché sto ancora imparando C, non voglio che il codice venga eseguito se normalmente non dovrebbe.
Quindi, c'è un modo per impedire a Dev-C ++ di "correggere i miei errori" quando si tratta di include
s, ovvero renderlo più un po '"rigoroso". ?
Soluzione
C90 aveva una funzione (assente di C99 e C ++) chiamata dichiarazione di funzione implicita: quando si utilizzava un nome non ancora dichiarato in una chiamata di funzione, il compilatore si comportava come se
extern int identifier();
era stato visto. Quella funzione è stata abbandonata da C99 e la maggior parte dei compilatori ha avuto la possibilità di avvertire questo ancora prima che il C99 fosse promulgato.
Anche quando si alloggia in C90, non è consigliabile utilizzare questo stile. Se devi mantenere il codice sfruttandolo e non puoi aggiungere prototipi, verifica che:
-
le funzioni restituiscono un int (è il caso di printf ma la validità dipende dall'implementazione per strlen che restituisce un size_t che può essere int o qualcos'altro)
-
la funzione non è variadica (è il caso di strlen ma non di printf)
-
il tipo di argomenti non viene modificato dalle promozioni degli argomenti predefinite (char, short, float are) e devi prestare attenzione a lanciare i puntatori su void * quando necessario quando il tipo previsto è nullo *, devi prestare attenzione a lanciare NULL sul tipo di puntatore corretto. (Queste sono le stesse cose che devi prestare attenzione per gli argomenti variadici a proposito).
Se tali condizioni non sono soddisfatte - e non lo sono per le chiamate nel tuo codice - si entra nel regno del comportamento indefinito.
Altri suggerimenti
Non so se questo sia effettivamente un problema DevC ++, ma in ogni caso dovresti considerare di abbandonarlo. Non è più in fase di sviluppo ed è molto difettoso. Consiglio di passare a Code :: Blocks , che è meglio sotto ogni aspetto e ti consente di utilizzare le ultime Compilatore GCC.
Una delle possibilità per un "comportamento indefinito" - che si ottiene se si chiama una funzione variadica senza un prototipo visibile - è che il codice viene compilato ed eseguito correttamente.
Se stai usando gcc come compilatore sottostante, dovresti essere in grado di passare flag come -std = c89 -pedantic -Wall -Wextra
e ricevere avvisi su codice come lo snippet che hai pubblicato.