Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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


"ché perder tempo a chi più sa più spiace" (Purgatorio, Canto III - v.78)
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.



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
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


"ché perder tempo a chi più sa più spiace" (Purgatorio, Canto III - v.78)
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...


"ché perder tempo a chi più sa più spiace" (Purgatorio, Canto III - v.78)
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.



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM