Discussion:
VSE 2013: error C2011 (Neudefinition)
(zu alt für eine Antwort)
ha
2015-06-22 14:35:55 UTC
Permalink
Hallo

Ich arbeite mit VSE 2013.

Bislang habe ich alles was ich brauchte, in einem Sourcefile
und meistens in einem Headerfile untergebracht.

Nun möchte ich aber verschiedene Sourcefiles einsetzen.

Mein Problem: Ich definiere eine Struktur in einem Hauptheaderfile,
die in mehreren der Sourcefiles benutzt wird.

Includiere ich das Hauptheaderfile im Hauptsource, erhalte ich eine
Fehlermeldung aus den anderen Sourcefiles, weil sie die Struktur nicht
kennen.

Includiere ich nun dieses Hauptheaderfile in den entspr. Sourcefiles,
erhalte ich den Fehler einer Neudefinition (error C2011).

Wie löse ich diesen "Widerspruch" auf?
Edzard Egberts
2015-06-22 14:51:02 UTC
Permalink
Post by ha
Bislang habe ich alles was ich brauchte, in einem Sourcefile
und meistens in einem Headerfile untergebracht.
Nun möchte ich aber verschiedene Sourcefiles einsetzen.
Mein Problem: Ich definiere eine Struktur in einem Hauptheaderfile,
die in mehreren der Sourcefiles benutzt wird.
Includiere ich das Hauptheaderfile im Hauptsource, erhalte ich eine
Fehlermeldung aus den anderen Sourcefiles, weil sie die Struktur nicht
kennen.
Includiere ich nun dieses Hauptheaderfile in den entspr. Sourcefiles,
erhalte ich den Fehler einer Neudefinition (error C2011).
Wie löse ich diesen "Widerspruch" auf?
Indem Du folgendes in Deine Header-Files einträgst:

#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H

.... // Header

#endif

Das klappt dann, so lange NAME_DEINES_HEADERFILES_H nicht in zwei
Header-Files auftritt. ;o)
ha
2015-06-22 15:28:44 UTC
Permalink
Post by Edzard Egberts
#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H
.... // Header
#endif
Das habe ich schon versucht. Aber das Problem tritt selbst bei
einfachsten Deklarationen auf. Z.b. BOOL xy; oder int abc;
(Das resultiert dann in Error C2086)

Ich möchte aber so effizient wie möglich arbeiten und nicht
jede einzelne Deklaration mit dem #ifndef-Konstrukt
umgeben ;-)
Olaf Schmitt
2015-06-22 17:42:09 UTC
Permalink
Post by ha
Post by Edzard Egberts
#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H
.... // Header
#endif
Das habe ich schon versucht. Aber das Problem tritt selbst bei
einfachsten Deklarationen auf. Z.b. BOOL xy; oder int abc;
(Das resultiert dann in Error C2086)
Ich möchte aber so effizient wie möglich arbeiten und nicht
jede einzelne Deklaration mit dem #ifndef-Konstrukt
umgeben ;-)
Das macht man aber so, wie es Edzard Egberts schon beschrieben hatte.
Kannst dir ja mal die Files von MS ansehen.

Und...
Du machst einen Denkfehler.
Du musst nicht jede einzelne Definition mit ifndef... etc umschließen.
Du umschließt das ganze Headerfile.
Das hat Edzard Egberts ja auch geschrieben.


#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H

// Hier 1, 10, 1000,1 Mio., oder 10 Mio. Definitionen

#endif


Olaf
ha
2015-06-22 19:13:21 UTC
Permalink
Post by Olaf Schmitt
Und...
Du machst einen Denkfehler.
Du musst nicht jede einzelne Definition mit ifndef... etc umschließen.
Du umschließt das ganze Headerfile.
Das hat Edzard Egberts ja auch geschrieben.
#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H
// Hier 1, 10, 1000,1 Mio., oder 10 Mio. Definitionen
#endif
Genau das hatte ich gemacht. Aber ich erhalte den Fehler
LNK 2005 ("Bereits enthalten"...)

Irgendwo mache ich wohl wirklich einen Denkfehler.
Olaf Schmitt
2015-06-22 20:06:47 UTC
Permalink
Post by ha
Post by Olaf Schmitt
Und...
Du machst einen Denkfehler.
Du musst nicht jede einzelne Definition mit ifndef... etc umschließen.
Du umschließt das ganze Headerfile.
Das hat Edzard Egberts ja auch geschrieben.
#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H
// Hier 1, 10, 1000,1 Mio., oder 10 Mio. Definitionen
#endif
Genau das hatte ich gemacht. Aber ich erhalte den Fehler
LNK 2005 ("Bereits enthalten"...)
Irgendwo mache ich wohl wirklich einen Denkfehler.
Dann poste doch mal deine include Files hier.

Olaf
ha
2015-06-23 16:05:01 UTC
Permalink
Post by Olaf Schmitt
Dann poste doch mal deine include Files hier.
Beispiel-Muster:


header.h:
---------

int abc;
BOOL def;

struct ghi
{
int xy;
};

struct ghi ghiS;

void fkt1(void);
float fkt2(char *P);


***********************************

file1.cpp:
---------

#include "header.h"

void fkt1(void)
{
mache etwas mit Var. "abc" oder "def" oder "fkt2" oder "ghiS"
};

***********************************

file2.cpp:
---------

#include "header.h"

float fkt2(char *P)
{
mache etwas mit Var. "abc" oder "def" oder "fkt1" oder "ghiS"
};



Auch wenn ich den Inhalt des Headers so umfasse: ...

#ifndef HEADER_GELADEN
#define HEADER_GELADEN

... Inhalt; s. oben

#endif


... funktioniert es nicht, wie ich schon beschrieb.


Aber ich werde mit dem, das Edzard empfahl, experimentieren.

Im Moment arbeite ich weiter, indem ich einfach alles
wieder in ein einziges Sourcefile packe.
Edzard Egberts
2015-06-23 06:06:19 UTC
Permalink
Post by ha
Post by Edzard Egberts
#ifndef NAME_DEINES_HEADERFILES_H
#define NAME_DEINES_HEADERFILES_H
.... // Header
#endif
Das habe ich schon versucht. Aber das Problem tritt selbst bei
einfachsten Deklarationen auf. Z.b. BOOL xy; oder int abc;
(Das resultiert dann in Error C2086)
Ach so, dann deklariere mit extern und definiere in einem Objektfile:
Also im Header "extern bool xy;" und irgendwo in einem .cpp "bool xy=
false;".

Es gibt da übrigens noch einen Trick, den ich gerne verwende um
Funktionen "einzupacken", das müsste eigentlich auch für Variablen gehen:

im Header:

namespace my_foos
{
bool MyVar;
void foo1();
blah foo2();
}

im Objekt:

bool my_foos::MyVar= false;

void my_foos::foo1()
{}

blah my_foos::foo2()
{
return Blubb;
}

Für Variablen habe ich das aber noch gar nicht gemacht, wenn eine
Funktion eine Variable erfordert, kommt das bei mir nämlich gleich in
eine Klasse.
ha
2015-06-23 16:07:04 UTC
Permalink
[ ... ]

Danke für eure Antworten. Ich werde das einmal ausprobieren, was du hier
beschreibst.

Loading...