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". ?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top