Newsgroup: it.comp.lang.c
Titolo: Re: Errore dal linker

 errore?
Ho la sensazione che tu non abbia le idee chiarissime su l  ruolo dei .h.
A  parte per qualche macro, i .h NON contengono le funzioni di libreria 
ma  i prototipi  relativi alle stesse. I codici oggetto sono nei vari 
files  di librerie che il linker utilizza per risolvere i riferimenti 
esterni.  Se mancano gli headre, il compilatore non segnala errore ma se 
poi gli argomenti o i valori di ritorno non corrispondono quanto al tipo 
dati puoi andare incontro a problemi di vario tipo.
Giorgio
P.S.  nota bene che i problemai relativi a gcc non hanno molto a che 
fare con il C standard ma con un particolare compilatore.

 dati puoi andare incontro a problemi di vario tipo.
Quindi mettere SEMPRE gli include degli header quando si chiama una funzione
non definita nel file da cui viene chiamata!!!! Sia per le funzioni di
libreria, sia per le proprie funzioni scritte
Può capitare che il compilatore non ti dà errore, il linker non ti dà errore
e poi il programma non funziona perchè manca un include di un header e tu
perdi un sacco di tempo a capirne il motivo.
Marco

 perdi un sacco di tempo a capirne il motivo.
Impossibile: se il programma non funziona non è per la mancata inclusione
di un header.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 di un header.
Fidati, mi è capitato più di una volta!!!
Se il compilatore quando compila un file trova una chiamata ad una funzione
di cui non conosce il prototipo (perchè manca l'inclusione dell'header dove
è definito tale prototipo), in genere interpreta gli eventuali argomenti e
l'eventuale valore di ritorno della funzione come di tipo "int", quando
magari non  lo sono. Quindi crea il file oggetto in uscita secondo questa
supposizione.
Quando poi durante l'esecuzione del programma questo arriva a tale chiamata
della funzione, gli argomenti vengono passati alla funzione come di tipo
"int" (perchè il compilatore ha tradotto così tale chiamata di funzione), ma
nella funzione gli argomenti sono usati invece secondo il loro reale tipo
(che se non sono di tipo "int" può portare con molta probabilità ad un
errore). Stessa cosa per il valore di ritorno della funzione.

<snip>
Sě, hai ragione, č possibile.


una certa funzione?
A seconda del sistema che usi.  Se hai un sistema Unix-like, da shell
dovrebbe essere sufficiente un: man nomefunzione ("man strcpy" per
esempio).  Sotto DOS/Windows devi rifarti a qualche sorta di help o
manuale in linea.  In ogni caso, per le funzioni standard, è tutto
documentato sul documento ISO (a pagamento, però).

che restituiscono un int, e non dice niente.
Il compilatore fa delle deduzioni e usa il tipo int come tipo
predefinito.  Questo significa, specie nel caso dei parametri formali,
che ci puņ essere una perdita di precisione.  A run-time, gli effetti
possono essere imprevedibili.

 una certa funzione?
Se hai il manuale del compilatore, dovrebbe esserci scritto tutto.
Altrimenti, se proprio non sai come fare, fai una ricerca della stringa del
nome della funzione che ti interessa usare negli header file che sono
presenti in una qualche directory del tuo PC. In pochi secondi vedi dove č
contenuto il prototipo della funzione.

 Giusto?
Si
Per non dare errore è sufficiente che il linker trovi la funzione,
indipendentemente da dove essa sia, non solo nella libreria standard.
Il linker linka tutti i file che ha come input, quindi libreria standard,
altre eventuali librerie, file oggetto (ottenuti dalla compilazione di file
C o dall'assemblaggio di file assembly).
Tutto questo vale per le funzioni di libreria, ma anche per le "tue"
funzioni, quelle scritte da te.