Newsgroup: it.comp.lang.c
Titolo: printf senza #include <stdio>

 
 quasi per caso mi sono reso conto che una cosa del tipo:
 int main() ...
        printf( "ciao");
....
compilato con gcc funziona perfettamente anche senza #include di stdio.h
...qualcuno mi spiega questa mia ignoranza senza confini?
Grazie mille
Ciauuu
menez
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ...qualcuno mi spiega questa mia ignoranza senza confini?
Perchè in realtà in C la dichiarazione del prototipo non è obbligatoria. 
  In questo caso il compilatore assume che printf ritorni un int e non 
controlla se la chiamata è corretta.

 ....qualcuno mi spiega questa mia ignoranza senza confini?
Certo, il file header non č indispensabile per la generazione del codice,
ma č necessario se vuoi far sě che il compilatore verifichi la correttezza
nel passaggio dei parametri.  A questo servono i prototipi delle funzioni.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Come il file header non e' necessario? Se usi funzioni che non siano 
dentro stdio.h il programma non verra' mai compilato e non verra' 
generato alcun codice. Io sapevo che la maggior parte dei compilatori 
inserisce di default la libreria stdio.h
-- 
BlackMesa

 inserisce di default la libreria stdio.h
Alt, alt, alt. Stop alle fesserie :-)
"io sapevo", ma se anche "io mi documentavo" e in ultima istanza "io 
provavo" era meglio.

 ha scritto:

Cioe' spiegati meglio la tua risposta non ha alcun senso. Vuoi dire che se 
scrivo del codice e non inserisco nessun header questo verra' compilato 
linkato e verra generato l'exe?
Da quello che dite sembra proprio cosi' e non mi sembra proprio il caso
-- 
BlackMesa

 Da quello che dite sembra proprio cosi' e non mi sembra proprio il caso
Quanto ti costa fare una provettina e fartelo sembrare?

 ...qualcuno mi spiega questa mia ignoranza senza confini?
Il "Standard" dice che questo programma è illegale (undefined
behavior) perque é illegale chiamare una funzione con parametri ... (3
punti) senza dichiarazione.
(La dichiarazione die prinft è  "int pintf(const char * format, ...)")
  int main()
  {
    puts( "ciao");
  }
é legale.
(La dichiarazione è int puts(const char * s))
-- 
Horst

 
Questo e` vero solo in parte.  Non vi e` alcun obbligo di usare i 
prototipi.  Undefined behavior non significa necessariamente illegale.
La chiamata a funzione di cui non e` stato definito il prototipo genera 
automaticamente un prototipo dai parametri usati nella chiamata.
L'uso di "printf("ciao");" nell'esempio riportato introduce un prototipo 
per la printf nella forma "int printf(char *);"
Successive chiamate alla printf() verranno validate con tale prototipo e 
quindi potrebbero generare un warning o causare un comportamento non 
definito.


Giovanni ha scritto:
???


 inserisce di default la libreria stdio.h
Se il mio compilatore facesse una cosa sensa senso del genere, lo
scarterei subito.  Forse ti riferisci alla caratteristica di alcuni
ambienti di sviluppo di creare un modello di applicazione, in base a certe
scelte dell'utente.  Ma questo non c'entra nulla con quanto stiamo dicendo.


 Quanto ti costa fare una provettina e fartelo sembrare?
cribbio....è verissimo !!!! ho provato con un codicillo che oltre alla
printf usava anche sleep (il prototipo della quale è in unistd.h)...ed è
andato....
Grazie mille del chirimento...
A proposito, dove posso trovare qualche doc su questi meccanismi? Ho letto
piu' di un testo sul C e C++ (per studio e per hobby)...ma nessuno si
sofferma su questi aspetti...C'è qualche documento non troppo dispersivo in
rete?
Ciauuuu
Menez
