Anonyme struct und union legal?



  • Ist folgende Konstruktion legales C++?

    struct foobar
    {
    	union 
    	{
    		struct 
    		{
    			char a,b,c,d;
    		};
    		int i;
    	};
    };
    


  • hm... weis net. aber ich habs auch schon öfters so gemacht 😃



  • User--- schrieb:

    struct 
    		{
    			char a,b,c,d;
    		};
    

    Declaration doesn't declare something. (oder so ähnlich)

    Ein anonymes struct/union kann nicht alleine existieren, ohne dass Du ein Objekt anlegst. Wie würdest Du sonst auch darauf zugreifen wollen.



  • 7H3 N4C3R schrieb:

    Ein anonymes struct/union kann nicht alleine existieren, ohne dass Du ein Objekt anlegst.

    Die Deklaration einer namenlosen union "ohne Objekt" deklariert ein Objekt.



  • Hmm stimmt... union ja. Aber struct? Ich meine nicht. Und struct in union auch nicht.



  • User--- schrieb:

    Ist folgende Konstruktion legales C++?

    struct foobar
    {
    	union 
    	{
    		struct 
    		{
    			char a,b,c,d;
    		};
    		int i;
    	};
    };
    

    Nein. Allein schon weil innerhalb einer anonymen Union keine udts deklariert werden dürfen. Siehe 9.5/2.



  • Ok, wäre auch zu schön gewesen 😞



  • Gibts nen workaround für folgende Schreibweise:

    foobar f;
    f.uni.abcdWrap.a;
    f.uni.i;

    damit man direkt f.a und f.i schreiben kann?

    Bei folgendem Aufbau

    struct abcdWrapper
    {
      char a,b,c,d;
    };
    
    union abcdiMerger
    {
      abcdWrapper abcdWrap;
      int i;
    };
    
    struct foobar
    {
      abcdiMerger uni;
    }
    


  • AFAIK nicht... was nicht heißen soll, dass es garnicht geht. Defines vielleicht 🙂 Referenzen?

    struct abcdWrapper
    {
      char a,b,c,d;
    };
    
    union abcdiMerger
    {
      abcdWrapper abcdWrap;
      int i;
    };
    
    struct foobar
    {
    private:
      abcdiMerger uni;
    public:
      char& a;
      char& b;
      char& c;
      char& d;
      int& i;
      foobar() : a(this->uni.abcdWrap.a),
                 b(this->uni.abcdWrap.b),
                 c(this->uni.abcdWrap.c),
                 d(this->uni.abcdWrap.d),
                 i(this->uni.i)
    }
    

    Keine Ahnung, ob das überhaupt gültig ist. Ist auch ziemlich pervers 😃 und sehr leicht zerbrechlich, da einige semantische Feinheiten drin sind. Und mir scheint, als willst Du die Union zum Casten benutzen. Das ist verboten

    Direkt aus dem Standard, 9.5, Clause 1:
    In a union, at most one of the data members can be active at any time, that is, the value of at most one of
    the data members can be stored in a union at any time.



  • Ja, hatte vor das zum casten zu verwenden. Habe derzeit bitshifts, so wäre es halt schneller. Aber wenn es verboten ist, dann kann ich auch beruhigt so leben.

    Danke 🙂


Anmelden zum Antworten