Newsgroup: it.comp.lang.c
Titolo: dubbio su header file...

Ciao a tutti :)
Da un po' di tempo mi sto dilettando con la compilazione sotto linux 
utilizzando gcc...ho notato una cosa..in pratica e' possibile compilare 
ogni file c singolarmente generando gli object e successivamente e' 
possibile linkarli per ottenere il binario finale (fin qui nulla di 
strano)...il dubbio e' questo : ho sempre pensato che scrivere il 
prototipo di una funzione e metterlo in un header file fosse 
necessario...ho invece visto che la compilazione e successivo linkaggio 
al main di un file c contenente solo funzioni e sprovvisto di header o 
prototipi funziona ugualmente...e' normale? ?
Ciao e grazie
Aragorn


E` normale che funzioni, ma se abiliti in fase di compilazione 
dell'oggetto l'opzione -Wall dovresti vedere i warning generati dalla 
mancanza dei prototipi.
In alcuni casi particolari potresti anche avere dei veri e propri errori 
in fase di esecuzione del programma.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 in fase di esecuzione del programma.
Ciao,
Ho provato con l'opzione -Wall (a dire il vero Anjuta la mette in 
automatico), ma non viene generato alcun warning...
Araogorn


$ lsodgf0@monica:~ > cat x.c
int main(void)
{
   int numero;
   numero = somma(1, 1);
   printf("numero = %d\n", numero);
   return 0;
}
$ lsodgf0@monica:~ > cc -c -Wall x.c
x.c: In function `main':
x.c:5: warning: implicit declaration of function `somma'
x.c:7: warning: implicit declaration of function `printf'


 x.c:7: warning: implicit declaration of function `printf'
Quella roba pero' non linka.
int somma(int x, int y)
{
   return x+y;
}
int main()
{
   return somma(6, 5);
}
Questo compila e linka senza nemmeno un warning.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 prototipi funziona ugualmente...e' normale? ?
Si e' normale se la funzione e' definita prima del punto dove
viene richiamata.


 
Non ho detto che dovesse linkare.  L'opzione -c non ti dice niente?


 Non ho detto che dovesse linkare.  L'opzione -c non ti dice niente?
Si, come mi dice qualcosa anche la frase dell'OP
<CITE>
... e successivamente e' 
possibile linkarli
</CITE>


> di header o prototipi funziona ugualmente...e' normale? ? 
</CITE>
Dalla frase dell'OP io interpreto che i files sono almeno 2.  Se ci sono 
chiamate a funzioni da un file all'altro e` giusto che linki, ma 
*devono* esserci i warning se non c'e` un header file con i prototipi.


 prototipi funziona ugualmente...e' normale? ?
ciao.
Si', e' normale, ed e' un comportamento documentato, anche se e'
fortemente sconsigliato perche' porta facilmente ad errori.
E di solito si fa credere ai neofiti che sia obbligatorio proprio
per non farli cadere negli errori! :-)
In pratica ogni volta che il compilatore incontra una funzione di
cui non sa il prototipo  cerca di "dedurlo dal contesto" e nel
caso in cui non ci riesca utilizza il tipo int come default.
Ad esempio, se trova una chiamata come questa:
   pippo( 7, "ciao");
Se la funzione pippo non e' dichiarata in nessun punto, la compila
come se fosse
   int pippo( int, char * );
Finche i tipi sono esattamente quelli che il compilatore deduce
va tutto bene. Il casino viene fuori se il vero prototipo e'
leggermente diverso, tipo:
   int pippo( double, char * );
In questo caso infatti il compilatore genera codice per la chiamata
in modo errato, incasinando lo stack e generando errori di accesso
alla memoria.
Il compilatore dovrebbe emettere dei warning per segnalarti il
problema , ma se la funzione e' in un altro file .c non ci riesce
(e non credo che il linker si accorga del problema)
Spero di aver chiarito il tuo dubbio!
ciao
Giacomo