PDA

Visualizza la versione completa : [C] Funzione Rand() e stdlib


Lak3d
01-11-2006, 14:09
Come mai la funzione rand mi funziona anche senza includere il file di intestazione stdlib? Sapreste illuminarmi?
Percaso viene a sua volta incluso in stdio.h?

andbin
01-11-2006, 15:43
Originariamente inviato da Lak3d
Come mai la funzione rand mi funziona anche senza includere il file di intestazione stdlib? Sapreste illuminarmi?
Percaso viene a sua volta incluso in stdio.h? Perché il fatto di poter usare una certa funzione non dipende tanto (e solamente) da un file di header ma dal fatto che il compilatore faccia il link con la libreria che la contiene. Quando compili il tuo programma, il linker alla fine linka comunque con la libreria standard.

Per usare rand() è richiesto l'include di <stdlib.h>. Il fatto che rand abbia come prototipo int rand(void); ti va bene.
Infatti se durante la compilazione del tuo programma il compilatore non trova i prototipi delle funzioni (es. perché non hai incluso i giusti header), lui pensa che le funzioni ritornano un int.
In altri casi, per altre funzioni, non includere l'header corretto può causare dei problemi con i tipi di dato restituiti.

Lak3d
01-11-2006, 17:21
ti ringrazio della risposta, ma non ho capito la questione del tipo int ritornato.
Nel mio caso non trova il file di intestazione ma linka comunque la libreria standard del C che contiene l'implementazione della funzione rand()... ok, è una libreria standard e quindi la trova comunque... ma non ho ben capito la questione dell'intero; se la funzione funziona correttamente significa che la trova... e quindi conoscerà anche il tipo di dato ritornato, no?

andbin
01-11-2006, 18:39
Originariamente inviato da Lak3d
significa che la trova... e quindi conoscerà anche il tipo di dato ritornato, no? Sì, la trova in fase di link ma .... in questa fase il linker non sa e non conosce minimamente cosa fanno le funzioni, cosa prendono in input e cosa restituiscono!!!! Il linker sa solo che la funzione pippo() è ad un certo offset dentro un modulo oggetto e un altro modulo oggetto (che non conosce dove sta la funzione) ne ha bisogno. Il linker si occupa solo di "fissare" gli indirizzi.

Loading