PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme bei der Definition von struct in headern



Gsus
24-11-2006, 08:27
Hallo an alle

so ich habe schon lange nach einer Lösung dieses Fehlers gesucht aber ich komme auf keinen grünen Zweig. Also das ist ein Auszug meines headers...


#define CNT_GAME 20 /* Count of game stones */
#define CNT_BLOCK 7 /* Count of block stones */

struct player{ /* Struct descripts a payer */
int color; /* color black or red */
int gamestones[CNT_GAME]; /* left gamestones */
int blockstones[CNT_BLOCK]; /* left blockstones */
};

struct coord { /* Struct for a coordinate on */
int a; /* the board */
int b;
};


aber beim kompelieren bekomme ich dann


quad.h:35: error: redefinition of 'struct player'
quad.h:41: error: redefinition of 'struct coord'


ich habe auch schon viel rumversucht, aber ich komme nicht auf die Lösung ich meine ich auch bei anderen es schon so gesehen zu haben aber die haben dann wahrscheinlich auch wieder was ganz anderes gemacht.

Fall jemand eine Tipp geben könnte wäre ich sehr zu dank verpflichtet

mfg

gsus

locus vivendi
24-11-2006, 08:41
Vielleicht hast du vergessen Include-Guards in den Headern anzulegen. Ansonsten musst du mit Details rausrücken.


#define CNT_GAME 20 /* Count of game stones */
#define CNT_BLOCK 7 /* Count of block stones */

Das gibt stylistisch gesehen übrigens 0 Punkte. Mit Präprozessor Defines solltest du höchstens arbeiten, wenn du den Wert auch für den Präprozessor brauchst. Ansonsten heißt das:

int const Cnt_Game = 20;
int const Cnt_Block = 7;

Gsus
24-11-2006, 22:32
erstmal vielen dank wenn man an sowas länger rumhängt sieht man den wald vor lauter bäumen nicht...

zum stylistischen Punkt, dass ist ein Projekt für die Hochschule und mein Prof hat das in seine Richtlinen so drin das Konstanten mit #define gemacht werden und nicht mit const

warum ?? tja du darfst zwar alles essen aber nicht alles wissen ;)

mfg

konrad

locus vivendi
24-11-2006, 23:06
zum stylistischen Punkt, dass ist ein Projekt für die Hochschule und mein Prof hat das in seine Richtlinen so drin das Konstanten mit #define gemacht werden und nicht mit const
Er weicht damit von allen Empfehlungen in Büchern, Artikeln usw. ab. Handelt es sich um C++ oder um C? In C weicht die Bedeutung der Definition von Konstanten wie ich sie gezeigt habe von C++ ab. Möglicherweise versteht dein Prof deshalb nicht was da vor sich geht...

Dazu: http://david.tribble.com/text/cdiffs.htm#C99-const-linkage

almoeli
28-11-2006, 10:12
Hi,

wie definiert man stylistisch korrekt in C (nicht C++) Konstanten welche in mehreren .c Modulen verwendet werden, aber halt nicht in allen die den Header verwenden?
Schreibt man


int const CNT = 6;

in einen Header, so kriegst der Linker nicht hin, weil ja external linkage und deshalb mehrfach definiert.
Schreibt man


static const int CNT = 6;

so gibt es bei -Wall (gcc) warnings, weil die Konstante halt nicht in jedem Modul das den Header anzieht verwendet wird.
Soll man die Konstanten als extern im Header deklarieren und in einem passenden .c Modul dann den Wert zuweisen? Das ist ja auch nicht gerade passend und manchmal gar nicht möglich.

Gruß

almoeli

7.e.Q
28-11-2006, 11:56
Vielleicht hast du vergessen Include-Guards in den Headern anzulegen.

Das ist sowas, oder?




#ifndef __HEADERFILE_H__
#define __HEADERFILE_H__

typedef struct...;


#endif

locus vivendi
28-11-2006, 19:25
Zitat:
Zitat von locus vivendi Beitrag anzeigen
Vielleicht hast du vergessen Include-Guards in den Headern anzulegen.
Das ist sowas, oder?


Code:

#ifndef __HEADERFILE_H__
#define __HEADERFILE_H__

typedef struct...;


#endif
Ja, das meinte ich.

guardian
29-11-2006, 09:45
Wobei man hier wohl die führenden Tiefstrich weglassen sollte, da man sonst unter Umständen mit vordefinierten Bezeichnern in Konflikt kommen könnte (und wer kennt schon alle definierten Bezeichner des Compilers bzw. der Compiler :))

#ifndef MYHEADER_H
#define MYHEADER_H
/* ... */
#endif