Newsgroup: it.comp.lang.c++
Titolo: definizione di variabili globali

Ho problemi di linking con le variabili globali. Ad esmpio
int board[NUM]=  {...};
è definito in un header.
Usando il vc++ 6 mi da errore di linking.
Se metto static davanti alla dichiarazione l'errore sparisce...come mai?
alberto

...

Perche' facendo come fai tu cerchi di definire una variabile board in
ciascun sorgente in cui includi il tuo header. Se metti 'static' fai
la stessa cosa, ma impedisci che le varie copie siano visibili al di
fuori di ciascun singolo sorgente.
Per ottenere quello che probabilmente vuoi devi dichiarare la tua
variabile nel tuo header come:
extern int board[NUM];
E quindi in un *singolo* .cpp definirla come
int board[NUM]=  {...};
Ciao,
Nicola

variabile nel tuo header come:
Io preferisco fare cosi :
in    myheader.h    metto
#ifdef GLOBALVAR
int board[NUM]=  {...};
#else
extern int board[NUM];
#endif
Poi in un . cpp (generalmente il principale)
#define GLOBALVAR
#include "myheader.h"
Il vantaggio e' che secondo tutte le variabili trovandosi nelle stesso
file sono piu "controllabili" e gestibili.

...

Anch'io facevo cosi', molti anni fa. Ora trovo preferibile definire le
variabili nel posto piu' logico, ovvero vicino a chi le usa, ed
evitare di ricorrere inutilmente a macro.
Penso sia preferibile ragionare in termini di moduli, dove ciascun
file .cpp corrisponde ad un modulo che contiene elementi
concettualmente collegati. Di questi solo quelli che e' opportuno
siano visibili in altri moduli sono dichiarati in un .h .
Ciao,
Nicola

siano visibili in altri moduli sono dichiarati in un .h .
Infatti io mi riferivo alle variabili globali.
Per quelle statiche le dichiaro ovviamente nel modulo stesso o nel
namespace di quel modulo.

 Infatti io mi riferivo alle variabili globali.
E' molto tempo che non ho piu' variabili globali.
Ciao,
Nicola

 E' molto tempo che non ho piu' variabili globali.
io invece non riesco a liberarmene ... se non sono variabili globali sono
oggetti globali ... :-/ come mene sbarazzo ???
cioe' so come farlo ma mi sparerei a fare oggetti che continuano a passarsi
reference invece di usarne uno solo globale x tutti i 400 oggetti ...
non so ...
ciao

"Nicola Musatti" <Nicola....@ObjectWay.it> ha scritto nel messaggio
news:a327cf48.03092...@posting.google.com...

Lo stesso vale per le costanti?
esempio:
const int a = 5;
Grazie per l'aiuto.
Alberto.

...

Pero' il codice risulta piu' facilmente generalizzabile e potrebbe
venire il momento in cui questo ti torna molto comodo. A me e'
capitato di dover cambiare un applicazione dall'utilizzo *del*
database (uno e unico) a quello di piu' database selezionabili:
generalizzare a posteriori e' un incubo peggiore che farlo a priori.
Ciao,
Nicola

 generalizzare a posteriori e' un incubo peggiore che farlo a priori.
io sto programmando un motore di rendering ;-) generalizzare troppo mi
porterebbe via solo prestazioni ... e se posso risparmiare nel passaggio di
reference nello stack non sarebbe male :-p
cmq una mezza idea per aggirare il problema mi e' venuta ... salvero'
puntatori in piu' nell'area interna dell'oggetto che vengono inizializzati
alla creazione dello stesso, almeno cosi' risolvo di non dover usare oggetti
globali occupando qualche k in piu' di memoria ...
ciao

 const int a = 5;
Tutte le costanti hanno linkage interno, ovvero si comportano come se
fossero dichiarate static; se le definisci in un header in linea di
principio tutti i .cpp in cui lo includi avranno una copia della
costante.
Il caso delle costanti di tipi interi e' un po' particolare, perche'
il compilatore e' libero di non allocare lo spazio corrispondente,
purche' non ci si riferisca alla costante per indirizzo. Quindi sta a
te valutare se prefierisci che il valore della costante sia visibile a
tutti, costringendo ad una ricompilazione quando lo modifichi, o se
preferisci nasconderlo in un .cpp, col rischio di una lievissima
inefficienza.
Ciao,
Nicola