Newsgroup: it.comp.lang.c
Titolo: negli header va la dicitura extern, oppure no?

Ciao a tutti,
da qualche tempo sto risistemando del codice C e sono incappato in un
dilemma di cui non trovo soluzione.
L'azienda con cui collaboro ha un metodo standard (credo comune a
molte altre situazioni) per la strutturazione dei programmi c.
Innanzitutto per ogni file "pippo.c" esiste sempre un file "pippo.h":
Nel file "pippo.h" sono elencati tutti i prototipi delle funzioni
preceduti dalla dicitura "extern", ad esempio:
// inizio File "pippo.h"
extern foo1();
extern foo2();
...
extern fooN();
// fine file "pippo.h"
Questo file verrà utilizzato esclusivamente dagli altri files c (non
"pippo.c") che vogliono usare tali funzioni.
Anche in cima al file "pippo.c"  compare tale elenco, ma senza
dicitura "extern" (per evitare che il compilatore si lamenti nel caso
in cui all'interno di una funzione vengano usate funzioni dichiarate
successivamente), Il file "pippo.c" sarà quindi del tipo:
// inizio file "pippo.c"
#include "a1.h"
#include "a2.h"
...
#include "aN.h"
int foo1();
int foo2();
...
int fooN();
int foo1(){
...
}
int foo2(){
..
}
...
int fooN(){
...
}
// fine file "pippo.c"
Ora vorrei sapere se è possibile fare a meno di ripetere i prototipi
delle funzioni sia nel file "pippo.c" sia nel file "pippo.h". In
particolare, è legale includere il file "pippo.h" nel file "pippo.c"
anche se i prototipi delle funzioni hanno la dicitura "extern"?
Ringrazio per la collaborazione.
Saluti.
Matteo


Ciao, nonostante possa essere un metodo piuttosto obbiettabile
solitamente io uso definire tutte le funzioni di file.c in file.h
senza la dicitura extern. Poi in file.c prima di includere file.h
dichiaro una macro utilizzata solo da file.c che mi serve per
includere altre librerie solo in file.c (cosi utilizzando file.h non
si include tutto e soprattutto non si rischia in un ciclo di include
di due file che si richiamano continuamente). Quindi includo file.h
anche negli altri file del progetto e uso i prototipi senza alcun
eccezione (uso gcc e compilo sempre con l'opzione -Wall - mostra tutti
i warning, anche minori -).
Se invece provi ad usare un prototipo dichiarato come extern secondo
me potrebbe causarti qualche errore, e probabilmente il non
ritrovamento della funzione soprattutto se di tipo static xxx.
Comunque basta fare una prova con un semplice file d'esempio sulla tua
architettura e verificare il tutto.
Spesso alcune cose cambiano. Da un GNU/Linux all'altro molte reazioni
mi cambiano: sotto slackware posso non lasciare l'ultima riga del file
bianca e mi compila senza warnings o errors, sotto altre distro mi da
un warning sull'ultima linea non lasciata bianca.
Non sò quale sia la tua architettura e il metodo migliore è, IMHO,
testare.
Chiedo scusa se non son potuto essere più preciso.
Buona notte.

 Matteo
Spero di essere stato comprensibile vista l'ora ;D
ciao
Lorenzo

 Spero di essere stato comprensibile vista l'ora ;D
Comprensibilissimo!

 modificatore extern è obbligatorio?
Io come standard metto le dichiarazioni di tutte le variabili e di
tutte le funzioni in un unico header file globale al programma e
questo file viene incluso in tutti i file di source.  Anche se extern
non è strettamente indispensabile metterla rende IMO il file più 
leggibile perché identifica immediatamente che si tratta di un prototipo.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >