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_H
    

    Verwendet 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 muss
    

    Mit 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.


Anmelden zum Antworten