Newsgroup: it.comp.lang.c++
Titolo: VC++ bastardo davvero?

o VC++6 è bastardo, o sono cretino
in una normalissima applicazione win32 (che non sto qui a raccontarvi per
non essere OT) ad un singolo sorgente, ho messo una classe (sempre nello
stesso sorgente) che semplifica la gestione del SystemMenu, questa classe
l'ho messa in un namespace 'xaero'
compilo e magia! tutto funziona meravigliosamente
allora penso: "ok, funziona, ma ci vuole un po' di ordine"
e faccio un copia/incolla del codice dove c'è il namespace, la classe e i
membri della classe in un nuovo file .cpp
in questo file (CSysMenu.cpp) includo tutti gli header già inclusi in
main.cpp, e da main.cpp includo CSysMenu.cpp con:
#include "CSysMenu.cpp"
vado a compilare e:
--------------------Configuration: ClassControlTest - Win32
Release--------------------
Compiling...
main.cpp
CSysMenu.cpp
Linking...
CSysMenu.obj : error LNK2005: "public: __thiscall
xaero::CSysMenu::CSysMenu(struct HWND__ *)"
(??0CSysMenu@xaero@@QAE@PAUHWND__@@@Z) already defined in main.obj
CSysMenu.obj : error LNK2005: "public: __thiscall
xaero::CSysMenu::~CSysMenu(void)" (??1CSysMenu@xaero@@QAE@XZ) already
defined in main.obj
CSysMenu.obj : error LNK2005: "public: void __thiscall
xaero::CSysMenu::AddItem(char const *,unsigned int)"
(?AddItem@CSysMenu@xaero@@QAEXPBDI@Z) already defined in main.obj
CSysMenu.obj : error LNK2005: "public: void __thiscall
xaero::CSysMenu::AddSeparator(void)" (?AddSeparator@CSysMenu@xaero@@QAEXXZ)
already defined in main.obj
Release/ClassControlTest.exe : fatal error LNK1169: one or more multiply
defined symbols found
Error executing link.exe.
ClassControlTest.exe - 5 error(s), 0 warning(s)
che caxxo significa?
in un solo file funzionava, con due no?
heeeeeelp plz!
--
ciao
..::[xaero]::..

in un solo file funzionava, con due no?
Tu hai reso CSysMenu.cpp un modulo ed e' parte del progetto.
In questo caso non ha senso #includerlo nel main visto che
altrimenti tutte le funzioni e le variabili definite da
CSysMenu compaiono due volte: una volta come simboli esportati
da main e una volta come simboli esportati da CSysMenu.
Quello che dovevi includere in main era "CSysMenu.h", un file
dove fosse presente solo l'interfaccia delle cose definite da
CSysMenu.
Confesso che mi intristisce un poco che il tuo *primo* pensiero
quando qualcosa va secondo te storto sia che il compilatore e'
bacato (anzi bastardo) o che si tratti di una cattiveria di
Bill Gates... manca secondo me quel minimo di consapevolezza di
ignoranza che permette di imparare.
Che si tratti di un buco del compilatore dovrebbe essere
*l'ultimo* dei tuoi pensieri: solo quando sei disposto a
scommettere un giro con la tua morosa che quello che hai
fatto e' giusto dovresti sospettare del compilatore.
Per quello che riguarda la competenza sul C++ agli autori di
VC++ tu non sei degno nemmeno di allacciare le scarpe (nota
che non la ritengo un'offesa... e questa cosa vale anche per me).
Davvero pensavi che con VC++ non fosse possibile spezzare
un progetto in piu' file ???? Mi lasci senza parole...
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 o VC++6 è bastardo, o sono cretino
Un semplicissimo caso di inclusione multipla, con conseguente violazione
della ODR?
Domenico Barra

 un progetto in piu' file ???? Mi lasci senza parole...
non ho pensato questo anche se l'ho detto  ;-))
solo che non sapevo che aggiungendo un file al progetto veniva
automaticamente incluso (visto che non vedo da nessuna parte la direttiva
include che include CSysMenu.cpp)
mi sono leggermente incazzato perchè quel messaggio di errore non mi
lasciava intuire una possibile soluzione, forse perchè non sono ancora
esperto
cmq grazie per la risposta
buon natale


> #include "CSysMenu.cpp"
Cioè ma ti rendi conto ????????????????????
Hai incluso un cpp!!!!!!!!!!! Senza guardia imagino.
Tutti i metodi implementati sia qui che nel file che se lo include.... un
disastro.
Ma come ti è venuto in mente ?????
Ci sono anche un altro 100 inaio di cose da dire ma mi fermo qui.