Statische Klassenvariable in Headerdatei wird nicht gefunden
-
Ich verstehe folgendes nicht. Folgende Klasse existiert (nur eine Header-Datei):
#ifndef A_H #define A_H namespace myA { class Foo{ public: static const int BYTES_HEADER = 4 + 2 + 6; static const int PROTOCOL_ID = 0; // [...] }; } #endif // A_HVerwendet wird sie innerhalb einer anderen Klasse:
// Foo wird natürlich included namespace myB { void Bar::process() { myA::Foo foo; // [...] if(vecBuffer.size() >= myA::Foo::BYTES_HEADER) { // [...] } if(protocolID != myA::Foo::PROTOCOL_ID) { // [...] } } }Visual Studio 2012: Keine Probleme.
g++:if(vecBuffer.size() >= myA::Foo::BYTES_HEADER)myA::Foo::BYTES_HEADER ist unbekannt (PROTOCOL_ID dagegen nicht
)Ich verstehe das nicht
-
myA::Foo::BYTES_HEADER ist unbekannt (PROTOCOL_ID dagegen nicht)
Entweder das ist nicht die ganze Wahrheit, oder GCC hat einen Bug. Einen Fehler kann ich nicht entdecken. Jemand anders etwa?
-
Ich kann mir nicht vorstellen, dass der gcc einen Bug hat. Auf der anderen Seite kompiliert (und läuft!) das auf dem Visual Studio durch.
-
RaffIchNicht schrieb:
Ich kann mir nicht vorstellen, dass der gcc einen Bug hat.
Ich schon.
Auf der anderen Seite kompiliert (und läuft!) das auf dem Visual Studio durch.
Auf der anderen Seite muss das nichts heißen, denn VC++ lässt eine Menge durchgehen.
-
Also: g++ ist 4.6.3 (ein neueren gibt es für meine Platform nicht).
Ich habe jetzt auf beiden Seiten (Windows + Linux) nochmal vollständig neu kompiliert.Windows mit dem Visual Studio 2012: Keine Probleme
Linu mit g++ 4.6.3: Kompiliert die entsprechende Datei, meldet aber beim Linken(in der auszugsweise dargestellten Datei): undefined reference to `myA::Foo::BYTES_HEADER'
Was könnte das noch sein?

-
Versuch mal eine Implementatiosndatei zue rstellen und die statischen Dinger darin zu definieren:
// A.h #ifndef A_H #define A_H namespace myA { class Foo{ public: static const int BYTES_HEADER; // Deklaration static const int PROTOCOL_ID; // [...] }; } #endif // A_H// A.cpp const int myA::Foo::BYTES_HEADER = 4 + 2 + 6; const int myA::Foo::PROTOCOL_ID = 0; // bin mir nicht sicher ob das const bei der Definition hin muss
-
Skym0sh0 schrieb:
Versuch mal eine Implementatiosndatei zue rstellen und die statischen Dinger darin zu definieren:
// A.h #ifndef A_H #define A_H namespace myA { class Foo{ public: static const int BYTES_HEADER; // Deklaration static const int PROTOCOL_ID; // [...] }; } #endif // A_H// A.cpp const int myA::Foo::BYTES_HEADER = 4 + 2 + 6; const int myA::Foo::PROTOCOL_ID = 0; // bin mir nicht sicher ob das const bei der Definition hin mussMit der Auslagerung in die cpp hat der g++ es gefressen... danke
-
Packt der GCC es, wenn die Optimierungen an sind?
-
volkard schrieb:
Packt der GCC es, wenn die Optimierungen an sind?
Ja, ab -O1 -flto. -O3 ohne -flto ist nicht ausreichend.