 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Georg Maaß Guest
|
Posted: Sat Nov 29, 2003 7:26 pm Post subject: Warum wird das Member statische nicht angelegt? |
|
|
Das Programm (hier verkürzt dargestellt) kompiliert, linkt aber nicht.
Der Linker beschwert sich in main.o über "undefined reference to
`gm::Value::typenames'". Die Größe von typenames (typenamesCount) kann
er jedoch korrekt ausgeben. Aber aus mir unverständlichem Grund, wird
das statische Member nicht angelegt.
Irgendwas scheine ich wohl falsch verstanden zu haben. typenames soll
read-only sein und die in der Klassen-Deklaration aufgezählten
unveränderlichen Elemente beinhalten.
int main(int argc, char **argv)
{
cout << gm::Value::typenames[0] << endl; // <<<<< PROBLEM
return 0;
}
namespace gm
{
class Value
{
public: static const char* const typenames[] =
{
"undefined"
, "string"
, "int"
};
static const unsigned int typenamesCount = (sizeof typenames / sizeof
*typenames);
[... Rest weg gelassen ...]
};
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sat Nov 29, 2003 11:31 pm Post subject: Re: Warum wird das Member statische nicht angelegt? |
|
|
Hallo,
Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
| Quote: | Das Programm (hier verkürzt dargestellt) kompiliert, linkt aber nicht.
Der Linker beschwert sich in main.o über "undefined reference to
`gm::Value::typenames'".
class Value
{
public: static const char* const typenames[] =
{
"undefined"
, "string"
, "int"
};
|
Als ich das letzte mal nachgeschaut habe, durfte man in einer
Klassendeklaration nur skalare Konstanten (int/enum) definieren.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Kostka, Volkmar Guest
|
Posted: Sat Nov 29, 2003 11:59 pm Post subject: Re: Warum wird das Member statische nicht angelegt? |
|
|
Hallo,
Georg Maaß wrote:
| Quote: | Das Programm (hier verkürzt dargestellt) kompiliert, linkt aber nicht.
Der Linker beschwert sich in main.o über "undefined reference to
`gm::Value::typenames'". Die Größe von typenames (typenamesCount) kann
er jedoch korrekt ausgeben. Aber aus mir unverständlichem Grund, wird
das statische Member nicht angelegt.
Irgendwas scheine ich wohl falsch verstanden zu haben. typenames soll
read-only sein und die in der Klassen-Deklaration aufgezählten
unveränderlichen Elemente beinhalten.
.... |
| Quote: | class Value
{
public: static const char* const typenames[] =
{
"undefined"
, "string"
, "int"
};
static const unsigned int typenamesCount = (sizeof typenames /
sizeof *typenames);
[... Rest weg gelassen ...]
};
}
|
Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.
In einer H Datei kannst du nur definieren.
MFG
Volkmar Kostka
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Nov 30, 2003 7:55 am Post subject: Re: Warum wird das Member statische nicht angelegt? |
|
|
Kostka, Volkmar wrote:
| Quote: | Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.
In einer H Datei kannst du nur definieren.
|
So funktioniert es, ist aber lästig fehleranfällig, weil ich so manuell
berechnen muß, wieviele Einträge das Array hat, während ich es dann an
anderer Stelle befülle. Das ist nicht schön.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Nov 30, 2003 6:35 pm Post subject: Re: Warum wird das Member statische nicht angelegt? |
|
|
Kostka, Volkmar wrote:
| Quote: | Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.
|
g++ 2.95.3 meckert weder bei dem static const char * const -Array noch
bei den static const char * const. Für die ersteren erzeugt er keinen
Code, für die zweiten dagegen schon. Integral sind beide nicht. Das
zweite funktioniert, das erste kracht im Linker.
g++ 3.3.2 ist da konsequenter. Bei ihm kompilieren beide nicht und als
Fehler gibt er an, daß nur integrale statische Members bei der
Deklartion auch initialisiert werden dürfen. Das ist auf jeden Fall
besser als das stillschweigend keinen Code erzeugen von g++ 2.95.3.
Die Restriktion des Standards halte ich jedoch für überzogen. Selbst
wenn das Kompilieren durch diese Einschränkung vielleicht ein paar
Sekunden schneller gehen sollte, so verbrauche wesentlich mehr Zeit für
eigentlich überflüssige Schreiberei.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Dec 01, 2003 1:17 pm Post subject: Re: Warum wird das Member statische nicht angelegt? |
|
|
Georg Maaß wrote:
| Quote: |
Kostka, Volkmar wrote:
Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.
In einer H Datei kannst du nur definieren.
So funktioniert es, ist aber lästig fehleranfällig, weil ich so manuell
berechnen muß, wieviele Einträge das Array hat, während ich es dann an
anderer Stelle befülle. Das ist nicht schön.
|
Wie dieses?
main.cpp
********
#include <iostream>
#include "test.h"
using namespace std;
int main(int argc, char **argv)
{
cout << gm::Value::typenames[0] << endl; // <<<<< PROBLEM
return 0;
}
test.h
******
namespace gm
{
class Value
{
public:
static const char* const typenames[];
static const unsigned int typenamesCount;
};
}
test.cpp
********
#include "test.h"
const char* const gm::Value::typenames[] =
{
"undefined"
, "string"
, "int"
};
const unsigned int gm::Value::typenamesCount =
(sizeof gm::Value::typenames / sizeof *gm::Value::typenames);
Compiliert und linkt unter VC++ 6.0 einwandfrei. Ich wuesste auch keinen Grund warum
es das nicht tun sollte.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|