Newsgroup: it.comp.lang.c++
Titolo: strutturazione postuma

Ringrazio anticipatamente tutti spero possiate aiutarmi e' una settimana che
mi cimento con questa stupidaggine.
Il quesito che sto per porre e' su di un programma Opengl ma riguarda solo
la sintassi del C++
Io ed un mio amico stiamo creando un programma OpenGl, il mio amico ha fatto
la stuttura base e me la ha spedita.
Ora tale struttura era in un unico file main.cpp e siccome non e' mia
abitudine programmare cosi',
ho iniziato a suddividere il file in moduli .cpp e .h, ho spostato le
variabili globali in un file global.h ed ho creato le predichiarazioni delle
funzioni nel main.h del main.cpp ed tutto funzionava ancora bene, dopodiche'
ho lasciato nel main.cpp solo le funzioni per la creazione della finestra di
Windows ed ho spostato quelle per la creazione di oggetti nel file
oggetti.cpp e le dichiarazioni di tali funzioni in oggetti.h ottenendo il
seguente errore di linkaggio:
Linking...
oggetti.obj : error LNK2005: "bool  fullscreen" (?fullscreen@@3_NA) already
defined in Main.obj
oggetti.obj : error LNK2005: "bool  active" (?active@@3_NA) already defined
in Main.obj
oggetti.obj : error LNK2005: "struct HWND__ *  hWnd" (?hWnd@@3PAUHWND__@@A)
already defined in Main.obj
oggetti.obj : error LNK2005: "struct HGLRC__ *  hRC" (?hRC@@3PAUHGLRC__@@A)
already defined in Main.obj
oggetti.obj : error LNK2005: "struct HDC__ *  hDC" (?hDC@@3PAUHDC__@@A)
already defined in Main.obj
oggetti.obj : error LNK2005: "struct HINSTANCE__ *  hInstance"
(?hInstance@@3PAUHINSTANCE__@@A) already defined in Main.obj
oggetti.obj : error LNK2005: "unsigned int *  texture" (?texture@@3PAIA)
already defined in Main.obj
oggetti.obj : error LNK2005: "unsigned int  base" (?base@@3IA) already
defined in Main.obj
oggetti.obj : error LNK2005: "unsigned int  loop" (?loop@@3IA) already
defined in Main.obj
oggetti.obj : error LNK2005: "bool *  keys" (?keys@@3PA_NA) already defined
in Main.obj
Debug/Main.exe : fatal error LNK1169: one or more multiply defined symbols
found
Error executing link.exe.
Creating browse info file...
Main.exe - 11 error(s), 0 warning(s)
Riferito alle variabili globali di global.h
I due file main.h e oggetti.h si includono a vicenda e tutti e due includono
il file global.h inoltre tutti i .h sono composti cosi':
#ifndef NOME_H
#define NOME_H
Variabili e predichiarazioni
#endif
Dove sbaglio?
E corretto strutturare un programma in questo modo?
Grazie a tutti per la cortese attenzione.

Ciao,
    credo che il tuo problema derivi dal fatto che hai effettuato la
definizione delle variabili locali in global.h.
In C++ puoi definire le variabili globali in un solo modulo di compilazione
(ad esempio main.cpp).
Altri moduli che vorranno utilizzare le variabili globali dovranno
"dichiarare" le stesse come extern (se le definiscono nuovamente c'e'
l'errore del linker).
Giambattista


Ho risolto, tutto dipendeva da un errore del VS 6.0
Comunque
#ifndef NOME_H
#define NOME_H
Variabili e predichiarazioni
#endif
impediscono per definizione quello che dicevi.
Le ho postate apposta :-P
Ciao e grazie.


Il costrutto dell'#ifndef serve ad evitare che avvenga una duplicazione
delle definizioni all'interno dello stesso modulo di compilazione (nel tuo
caso main.cpp e oggetti.cpp); il tuo problema, invece, credo fosse che il
file global.h (contenete le definizioni delle variabili globali) venisse
comunque incluso sia da main.cpp che oggetti.cpp: la definizione degli
oggetti avveniva in entrambi i moduli ed il problema veniva a galla,
ovviamente, a tempo di collegamento, quando il linker, dovendo risolvere i
simboli, li trovava duplicati.
Ciao


#ifndef NOME_H
#define NOME_H
Variabili e predichiarazioni
#endif
Sono direttive del precopilatore ed evitano appunto che vengano incluse due
volte poiche' in pratica ho creato una macro di compilazione (#ifndef
NOME_H)che se e' gia' definita (#define NOME_H) non viene ne ricompilata ne
rinclusa in un bel niente.
Il mio errore consisteva nel fatto che nel VC++ (sottolineo che dipendeva da
quello, mi e' stato detto ed ho verificato che ora tutto funziona) tutti i
cpp che non hanno il main devono essere esclusi dal progetto ed i loro
header file che devono essere inclusi in quello del main (#include
"nome.h" ) devono richiamarli esplicitamente con  #include "nome.cpp"
altrimenti il linker del WC++ (ora lo chiamo cosi' perche' lo ho specificato
prima) si incazza.
Se ho detto che ho risolto e che non dipendeva da quello perche' dubiti,
mica dico fregnacce?
Ciao.

Nel post ho invertito inavvertitamente (mazza che cacofonia) :-((
(#ifndef NOME_H)
(#define NOME_H)
(#ifndef NOME_H) verifica se gia definita
(#define NOME_H) crea la macro di compilazione
non mi sono rincoglionito non ancora almeno.
Ciao.