"Lisbet Kaas Petersen" <lisbet.kaas@mail.tele.dk> skrev:
>Jeg kan ikke få include til at fungere rigtigt i nedstående filer. Der
>kommer fejl med, at nogle variabler allerede findes i andre objekter, når de
>skal linkes sammen.
Regel #1 for et sådant indlæg: Inkludér den faktiske fejlbesked. Jeg så
først (straks) hvad der var galt da jeg læste dit andet indlæg hvor der
var fejlmeldingerne med.
Uden at have afprøvet det er jeg sikker på, at problemet er brugen af
variabel-definitioner i header-filer, i stedet for deklarationer:
>test.hpp:
>char mailAdress[64];
[etc]
Header-filer bør kun deklarere ting, ikke definere dem. At deklarere X
fortæller compileren, hvad X er. At definere X er at bede compileren om
direkte at oprette en X-ting her og nu. I praksis skriver man således:
extern char mailAddress[64]; /* deklaration */
char mailAddress[64]; /* definition */
Du må hjertens gerne fortælle utallige gange hvad X er (deklaration).
Men du kan kun have én ting i hele dit program ved navn X (definition).
Dit problem er sikkert, at du definerer mailAddress osv i test.hpp og
inkluderer den header-fil i flere C-filer. Dermed vil de compilerede
objekt-filer jo hver indeholde en variabel ved navn mailAddress. Når alt
til slut skal klistres sammen af linkeren har vi balladen, for der er
pludselig mere end én variabel, der hedder mailAddress. Det må man ikke.
Løsningen er kun at deklarere mailAddress (osv) i test.hpp. Altså at
skrive
extern char mailAddress[64];
i stedet for. Dermed fortæller du alle, der inkluderer test.hpp, hvad
mailAddress er for en størrelse og det er alt, hvad de har brug for at
vide. Selve definitionen, altså den egentlige variabel, putter du så i
en passende C-fil. Det kunne fx være test.cpp. (Rådet gælder naturligvis
for alle dine header-filer.)
Dermed ved alle dele af dit program vide hvad mailAddress er, men der
vil kun optræde én egentlig variabel med det navn. Og det er løsningen.
--
Richard Flamsholt
richard@flamsholt.dk -
www.richard.flamsholt.dk