Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Divisione in moduli di un progetto
Forum - C/C++ - Divisione in moduli di un progetto

Avatar
Giarados (Ex-Member)
Pro


Messaggi: 69
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 13:44
Lunedì, 01/11/2010
Vorrei dividere un mio progetto in moduli. Soprattutto vorrei organizzarlo in questo modo:

negli headers prototipo le funzioni "utilities" e definisco le classi
nei source *.cpp / *.c implemento i metodi delle classi e le funzioni utilities

Poi compilo uno per uno i sorgenti ottenendo gli object files.

Il problema è che quando, in fine, linko il tutto, giustamente, ottengo una sfilza di "multiple definition of...". Normalmente includendo 6 volte la stdio.h gli spetta di diritto al linker insultarmi a modo suo. Ma se non includo l' header.h in un modulo quando vado per compilare naturalmente gcc mi risponde con una ventina di "undefined reference to".

Ultima modifica effettuata da Giarados il 01/11/2010 alle 13:45
PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
2
Down
V
Segnala al moderatore
Postato alle 14:06
Lunedì, 01/11/2010
all'inizio del tuo header devi usare delle direttive di preprocessore in questo modo:

Codice sorgente - presumibilmente C/C++

  1. #ifndef ETICHETTA_A_TUA_SCELTA
  2. #define ETICHETTA_A_TUA_SCELTA
  3.  
  4. // codice dell'header
  5.  
  6. #endif



Così l'header verrà importato solo una volta.

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
1
Down
V
Segnala al moderatore
Postato alle 16:14
Lunedì, 01/11/2010
Testo quotato

Postato originariamente da Giarados:

il problema continua a persistere solo per due variabili contenute in OFIELD.h .

Ho messo all'inizio di ogni source che include quest'header il seguente codice:

Codice sorgente - presumibilmente C/C++

  1. #ifndef OFIELD
  2. #  include "include/OFIELD.h"
  3. #endif



e in OFIELD.h :
Codice sorgente - presumibilmente C/C++

  1. #ifndef OFIELD
  2. #  define OFIELD
  3. #endif



però non funge..mi segnala sempre che quelle 2 variabili vengono dichiarate due volte..



dichiarale extern nei file .h e in quelli .cpp fai la dichiarazione vera e propria :k:

PM
Avatar
Giarados (Ex-Member)
Pro


Messaggi: 69
Iscritto: 25/07/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 15:29
Lunedì, 01/11/2010
il problema continua a persistere solo per due variabili contenute in OFIELD.h .

Ho messo all'inizio di ogni source che include quest'header il seguente codice:

Codice sorgente - presumibilmente C/C++

  1. #ifndef OFIELD
  2. #  include "include/OFIELD.h"
  3. #endif



e in OFIELD.h :
Codice sorgente - presumibilmente C/C++

  1. #ifndef OFIELD
  2. #  define OFIELD
  3. #endif



però non funge..mi segnala sempre che quelle 2 variabili vengono dichiarate due volte..

Ultima modifica effettuata da Giarados il 01/11/2010 alle 15:29
PM
Avatar
Giarados (Ex-Member)
Pro


Messaggi: 69
Iscritto: 25/07/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 16:46
Lunedì, 01/11/2010
Ci avevo pensato anch'io ma non avevo provato perchè mi sembra un poco "elegante". Comunque per il momento va bene :) ancora c'è tanto lavoro da fare e non posso di certo perdermi per due variabili. Però continuo a non capire perchè facendo come dice netarrow non funge. In fin dei conti è come se l'inclusione viene fatta una sola volta. Boh...

PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
0
Down
V
Segnala al moderatore
Postato alle 22:13
Lunedì, 01/11/2010
Le direttive di preprocessore non vanno usate per wrappare l'include, ma proprio dentro il file header.
Cioè il contenuto del file OFIELD.h lo fai stare in mezzo a quel codice.

PM