[VC2005] statische Konstanten in Klassen

11/02/2011 - 08:18 von Stefan Reuther | Report spam
Hallo,

gegeben folgendes Mini-Projekt:
==> a.h <= struct foo {
static const int i = 99;
};
void bar(const int&);

==> a.cpp <= #include "a.h"
const int foo::i; // <-
void bar(const int& i)
{ }

==> b.cpp <= #include <windows.h>
#include "a.h"
int main()
{
bar(foo::i);
return 0;
}

Mit dem Compiler von Visual Studio 2005
Microsoft (R) 32-Bit C/C++-Optimierungscompiler Version 14.00.50727.762 fuer 80x86
uebersetzt
cl a.cpp b.cpp
erhalte ich den Fehler
error LNK2005: "public: static int const foo::i" (?i@foo@@2HB) ist bereits in a.obj definiert.
Wenn ich die markierte Zeile rausnehme, geht es durch den Linker,
allerdings ist diese Zeile laut ISO-C++ noetig. Entsprechend weint
auch der gcc und andere Compiler, wenn ich sie weglasse. Mit "/Za"
akzeptiert der MS-Compiler den Code, bringt dann aber ein paar
Fantastilliarden Fehler in <windows.h> und Konsorten.

Hat jemand mal einen Tipp wie's geht? Mein Google-Fu war bisher nicht
ausreichend, und die Hilfe war nicht besonders hilfreich.


Stefan
 

Lesen sie die antworten

#1 Edzard Egberts
11/02/2011 - 09:06 | Warnen spam
Stefan Reuther schrieb:
gegeben folgendes Mini-Projekt:
==> a.h<=> struct foo {
static const int i = 99;
};
void bar(const int&);

==> a.cpp<=> #include "a.h"
const int foo::i; //<-
void bar(const int& i)
{ }



Na ja, versuche doch mal das:

==> a.h<= > struct foo {
static const int i; // Deklaration
};
void bar(const int&);

==> a.cpp<= > #include "a.h"
const int foo::i= 99; // Definition
void bar(const int& i)
{ }

Ähnliche fragen