Newsgroup: it.comp.lang.c++
Titolo: Problemi di compiulazione su più file con visual c++

Aiuto ho un problemone di linkaggio col visual c.
Ho definito delle strutture in un header e al momento della
compilazione, durante il linking, mi compaiono 77 errori, dovuti a
definizioni multiple delle stesse strutture di cui parlavo sopra,e che
si riferiscono al linkaggio dei vari header.
Per tentare di risolvere l'errore ho inserito in ogni header file 
#ifndef
#def
#endif
ma senza ottenere grossi risultati.
Qualcuno puņ aiutarmi se nn risolvo questo problema addio borsa di
studio!!!

 studio!!!
ciao,
Nids
ps: in vs se cliccando con il destro sul "solution explorer" selezioni "add
class" o qualcosa del genere (adesso non ho vs sotto mano) ti crea i file .h
e .cpp con gia' gli header messi al punto giusto e lo scheletro minimale
della classe.

 della classe.
nids avevi ragione l'errore non parte dagli header file.
il problema è sicuramente nel file cpp solo che io nn lo vedo.
mi sono accorto che se definisco le strutture all'interno dei file cpp
che le utilizzano l'errore rimane ed è sempre lo stesso, faccio un
esempio:
crea_html.obj : error LNK2005: "struct coda * intail"
(?intail@@3PAUcoda@@A) already defined in ACQSENS(FILE).OBJ
generazion_rando.obj : error LNK2005: "struct coda * intail"
(?intail@@3PAUcoda@@A) already defined in ACQSENS(FILE).OBJ
  code.obj : error LNK2005: "struct coda * intail"
(?intail@@3PAUcoda@@A) already defined in ACQSENS(FILE).OBJ
p.s.sicuramente il problema è in acqsens.cpp ma non so dove.
spero che qualcuno di voi conosca quest'errore spiegandomi cos'è e da
cosa potrebbe essere causato.
attendendo una risposta vi saluto

Tu non hai un problema di definizione ma di istanziazione. Stai istanziando
piů volte la stessa cosa (istanziare: quando crei una variabile di un certo
tipo, definizione: quando definisci un nuovo tipo).
Devi definire la variabile in un singolo posto (di solito si usa un file .c
o .cpp) e poi metti in un header a cui accedono tutti quelli che devono
usare la variabile qualcosa del tipo:
extern <nometipo> <nomevariabile>;
(per es. extern int iConteggio; )
(annotazione: č perfettamente legale fare questo:
extern int i;
int i = 0;
Cioč tu puoi avere l'extern anche nel modulo in cui la variabile č definita.
Ciň non crea alcun tipo di problema (e anzi, risolve il problema
dell'inclusione dell'header nel file in cui č definita la variabile)
--- bye

Grazie per l'appunto.Le strutture che mi generano l'errore sono state
definite all'interno di un header file e sono varie istanze di una
struttura dati, precisamente 5 puntatori alla struttura dati e altri
10 puntatori alle strutture in questione:5 alla coda e 5 alla testa.
Ora il problema si ha proprio nel momento in cui il sistema tenta di
accedere alle strutture in fase di linkaggio;infatti come si legge dai
messaggi di errore del compilatore le strutture sono già state
definite nel file acqsens.obj e, premetto che non ho studiato la fase
di linking del compilatore quindi potrei dire qualche fesseria, gli
altri file non riescono ad accedere alle strutture durante il
linking;questa e l'idea che mi sono fatto del problema in se stesso,
probabilmente è una stupidata però non riesco a venirne a capo.ora
vediamo se ho capito quello che volevi dirmi MaxMax:
se io dichiaro una variabile extern in un header poi, nei vari file c
che richiedono il link alla struttura, posso ridefinirle come
nell'esempio di cui sopra...ma questo mi genera un'errore nella
compilazione, (per essere sicuro di non dire una scempiaggine l'ho
pure provata),perchè cerco di definire nuovamente dei puntatori a
delle strutture.tu dirai: no basta che le definisci nell'header e poi
vi accedi richiamandole;no, questo già lo faccio.
In fine credo che la soluzione sia qui nei paraggi ma non riesco
ancora a coglierla.
Se vi può essere di aiuto nel prossimo post allego un frammento di
codice dei file che generano l'errore. Vi ringrazio bye.

Non ho capito quello che hai detto (ho gli occhi che mi si intrecciano). Ti
faccio un esempio di come vanno fatte le cose:
//---------------------
// a.h
struct MyStruct
{
    int a;
    int b;
}
extern MyStruct ms;
extern MyStruct *pms;
extern int i;
//---------------------
// a.cpp
#include "a.h"
MyStruct ms;
MyStruct *pms;
int i = 5;
void funcone()
{
    i = 0;
    ms.a = 0;
    ms.b = 0;
    pms = new(MyStruct);
}
//---------------------
// b.cpp
#include "a.h"
void functwo()
{
    i = 5;
    ms.a = 4;
    ms.b = 3;
    pms = new(MyStruct);
}

ok,c'ero arrivato fin qui; ma non é questo il problema:io ho una serie
di code dinamiche nel file strutture.h  faccio:
 typedef struct coda{
	int zona[3];
	struct coda * pros;
	struct coda * prec;
        }coda;
extern struct coda *intr,*allag,*gas;
extern  struct coda * intail,*intest,*gatest,*gatail*altail,*altest;
e definisco una serie di puntatori per queste strutture tutti
inizializzati a NULL(vengono inizializzati a null nel main.cpp).
durante l'esecuzione dell'programma l'utente può decidere di
interrogare un file, se lo fa la procedura prevede che il sistema
generi delle code(come sopra), "attaccandole" al puntatore inerente.
Restano gli errori di linking appartenenti agli altri file.cpp.Mi
spiego meglio :il porgetto e diviso in sei file e in cinque header,le
funzioni relative alle code sono definite in code.h ma in esso non vi
sono riferimenti alle strutture o al file strutture.h (nel quale vi
sono le definizioni relative alle strutture)
quindi: perchè ho errori di questo tipo?
main.obj : error LNK2005: "struct coda * intr" (?intr@@3PAUcoda@@A)
already defined in code.obj
Routine_servizio.obj : error LNK2005: "struct coda * gas"
(?gas@@3PAUcoda@@A) already defined in code.obj
bye

 (?gas@@3PAUcoda@@A) already defined in code.obj
A occhio e croce ti sei dimenticato qualche definizione nel file code.cpp.
Prova a guardarlo con attenzione.
--- bye

Grazie Max finalmente ho eliminato gli errori ora posso passare al debug.
mi sei stato di molto aiuto.
bye.

Ho una domanda per voi:
per caso esiste qualche sito con la lista completa degli errori,
dovuti alla compilazione, del visual studio 6(possibilmente in
italiano)?
o comunque un manuale per visual in italiano?
vi ringrazio fin d'ora
bye


Gli errori di compilazione sono tutti presenti nell'MSDN. Se hai il VS in
italiano allora forse sono in italiano. Cercali per codice (C????)
--- bye

sfortunatamente ho msdn  e visual in inglese, non è disponibile sulla
rete altro materiale?
Cmq grazie bye