Newsgroup: it.comp.lang.c++
Titolo: Variabili Globali e Classi (aiuto)

Ho un piccolo/grande problema che mi assilla:
"ho un sorgente c++ diviso per funzioni  in molti blocchi di codice, come
posso fare
perche' le variabili globali  (che sono in un loro blocco di codice) vengano
viste da
tutti i blocchi durante la compilazione del programma, un include su ogni
blocco del
tipo :
#include "Variabili.h"
provoca naturalmente un errore durante il link del programma. come fare??
io ho risolto creando un blocco nuovo con tutte le variabili duplicate
dichiarandole "extern"
che includo poi in ogni blocco di codice.
ma non mi sembra la soluzione migliore, inoltre le classi del programma per
dichiararle
extern le devo includere per intero aggiungendo il prefisso extern,(non ho
trovato altro modo)
l a v o r a c c i o   i n f a m e ,  dove sbaglio???
Grazie a chiunque riesca a mettere un poě di ordine (finalmente) nel mio
codice.

 tutti i blocchi durante la compilazione del programma,
Ehm...ho paura che questo sia solo il primo dei tanti problemi che 
incontrerai, dovuti all'(ab)uso delle variabili globali. Per fortuna e' 
anche il piu' facile da risolvere :)
Le prime soluzioni che mi vengono in mente sono:
1. dichiari tutte le variabili in un modulo cpp a parte (variabili.cpp) che 
*non* include variabili.h. In variabili.h metti solo le dichiarazioni 
extern. Ovviamente ad ogni variabile globale che aggiungi devi andare a 
modificare entrambi i moduli e ricompilare tutta la baracca (qualche 
maligno potrebbe dire che e' la giusta punizione :)
2. in variabili.h scrivi qualcosa del genere:
   #ifdef __VARIABILI_MAIN__
	int variabile_globale;
   #else
	extern int variabile_globale;
   #endif
   nel modulo principale del tuo progetto (e solo li') scrivi:
   #define __VARIABILI_MAIN__
	#include "variabili.h"
   #undef __VARIABILI_MAIN__
   negli altri moduli includi variabili.h normalmente. 
   Questa soluzione e' leggermente piu' pratica (devi modificare solo un
   file), ma rende variabili.h un po' meno leggibile.
3. in variabili.h definisci una struttura contenente le tue var. globali:
	struct GLOBAL {
		static int variabile;
	};
   in variabili.cpp le inizializzi:
	int GLOBAL::variabile = 321;
   negli altri moduli le usi a piacimento.
4. dichiari tutte le tue variabili globali in variabili.cpp, come static:
   static int variabile = 123;
   int  GetVariabile()	{ return variabile; }
   void SetVariabile(int v)	{ variabile = v; }
   in variabili.h definisci solo i prototipi delle funzioni:
   int  GetVariabile();
   void SetVariabile(int v);
   questa soluzione e' leggermente meno efficiente delle altre (c'e' da 
   pagare il pedaggio di una chiamata a funzione ad ogni accesso), pero'
   hai molto piu' controllo sull'accesso alle variabili -- puoi ad esempio
   proteggere l'accesso se la tua applicazione e' multithreading, oppure
   puoi agevolmente mettere un break o un debug trace in SetVariabile() e
   vedere tutte le volte che quella variabile viene modificata, e da chi. 
   Senza contare che, tecnicamente, le variabili dichiarate in questo modo
   non sono globali...
Beh, penso che come per una prima scelta possa bastare: se ti serve 
compilare in fretta, usa (1) o (2) e vai col tango. Se vuoi qualcosa di 
piu' carino (con un po' di modifiche da fare nel codice) usa (3). Se vuoi 
piu' controllo sull'accesso alle variabili globali e facilita' di debug (a 
scapito di un po' di efficienza) la (4) fa per te.
Ciao,
Antonello
-- 
// --------------------------------------------------------
// Antonello Salvatucci, Software Engineer
// LEGO Media International
// Klovermarken 120, 7190 Billund DENMARK
//
// antonello at digi. lego. com         
http://www.lego.com

l a v o r a c c i o   i n f a m e ,  dove sbaglio???
Nell'usare troppe variabili globali; dovrebbero essere
l'eccezione, non la regola.
Alex