Newsgroup: it.comp.lang.c
Titolo: Domanda sui file include

Salve a tutti,
ho un problema logico di programmazione in C.
Ho inserito un funzione, diciamo function(), in un file a parte
chiamato function.c. Il prototipo della funzione e una typedef
utilizzata (typedef unsigned char Byte) li ho messi in function.h
Ora, scrivo il programma principale main.c che utilizzerà quella
funzione e quindi include function.h. Da un punto di vista logico
io so che in function.h c'è tutto quello che mi serve per utilizzare
la funzione function() e basta. Per il resto ignoro cosa c'è scritto
poiché potrebbe essere stata scritta da un altro programmatore.
Voglio utilizzare, però, la stessa typedef anche in main.c ma, ovviamente,
se la scrivo in main.c il compilatore mi dà errore poiché è già definito
in function.h, incluso in main.c.
D'altra parte, io non sono tenuto a sapere che c'è scritto in function.h
e quali typedef sono definiti, quindi come si fa in questi casi?
Ovviamente l'esempio è semplice, ma in progetti più complessi
è bene separare i vari oggetti ed evitare di mescolarli a casaccio.
Come si procede correttamente in questi casi?

 e quali typedef sono definiti, quindi come si fa in questi casi?
Con la documentazione della libreria di funzioni. :-)
Se stai lavorando ad un software in concomitanza con altre persone
(almeno una), *devi* sapere, oltre ai prototipi delle funzioni, anche
che tipi sono stati definiti nella libreria, proprio per ovviare a
questi casi.
Bye,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)           [ 
http://www.radiance.d2g.com/~zefram
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

e quali typedef sono definiti, quindi come si fa in questi casi?
No, il .h lo devi conoscere per forza, se no che .h e'? :)
Dovresti anche modificare il tuo .h in questo modo:
#ifndef _NOMEMODULO_H
#define _NOMEMODULO_H
...
#endif
E al posto dei 3 punti ci metti tutto.
Cosi' puoi includerlo tranquillamente in vari moduli, anche se si
richiamano tra di loro.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 Come si procede correttamente in questi casi?
Il problema non è da poco. Se programmi in C++, dai un'occhiata alla keyword
namespace, che serve appunto ad isolare gli spazi di nomi per evitare
conflitti tipo quello esposto da te. Ad esempio, puoi fare una cosa del
genere:
namespace function {
    typedef unsigned long int Pincopallino;
    Pincopallino func(void);
}
namespace main {
    typedef double Pincopallino;
}
e le due cose non sarebbero in conflitto, perché quando vuoi riferirti al
Pincopallino del namespace main useresti:
main::Pincopallino foo;
e per quello di function, al contrario:
function::Pincopallino foo;
In C questo meccanismo non è disponibile: sta al buon senso di chi programma
dare nomi che difficilmente andranno in collisione (es. al posto di Byte
f_byte per il tipo byte definito in function), e documentare quali nomi
vengono utilizzati.
Lanugo of the Wandering Souls


... se usi una variabile definitain.h , quando la usi in main.c la devi ,
prima
di usarla , dichiararla extern  int pippo;
Ciao