Anonyme union

Wenn man in C eine struct vereinbart, in der ein union enthalten ist, dann braucht die union einen eigenen Namen innerhalb der struct, über den ihre Elemente angesprochen werden.

Beispiel: Eine etwas schlicht veranlagte Partnervermittlung möchte ihre Kunden möglichst platzsparend speichern, und möchte bei männlichen und weiblichen Kunden nur das für die erfolgreiche Vermittlung wichtigste Merkmal anlegen. Dies könnte so aussehen:

/* Time-stamp: "31.10.04 09:44 union1c.c klaus@wachtler.de"
 */

#include <stdio.h>

struct kunde
{
  char
    *vorname,
    *nachname;
  union
  {
    int     koerbchengroesse;
    double  einkommen;
  } dummy_union;
};

int main()
{
  struct kunde
    frau,
    mann;

  frau.dummy_union.koerbchengroesse = 'B';
  mann.dummy_union.einkommen = 1500.00;

  return 0;
}

In C++ ist diese Regel gelockert: Man kann den Namen der union weglassen (anonyme union) und kann dann die Elemente der union wie Elemente der struct ansprechen:

// Time-stamp: "(15.11.01 12:03) union1.cpp [Klaus Wachtler (aw38)]"

struct kunde
{
  char
    *vorname,
    *nachname;
  union
  {
    int     koerbchengroesse;
    double  einkommen;
  };
};

int main()
{
  kunde
    frau,
    mann;

  frau.koerbchengroesse = 'B';
  mann.einkommen = 1500.00;
}
Das ist in C++ möglich, weil die Elemente der anonymen union im selben Namensraum liegen, wie die der struct. Dies heißt aber umgekehrt, daß die Elementnamen eindeutig unterscheidbar sein müssen.

Allerdings ist es nicht möglich, innerhalb der anonymen union eine ebenfalls anonyme struct anzulegen; hier ist dann doch wieder eine zusätzlicher Name erforderlich:

// Time-stamp: "(15.11.01 12:03) union2.cpp [Klaus Wachtler (aw38)]"

enum haarfarbe_e
{
  blond, rot, dunkel
};

struct kunde
{

  char
    *vorname,
    *nachname;

  union
  {
    struct
    {
      int                koerbchengroesse;
      enum haarfarbe_e   haarfarbe;
    } weiblich;

    double   einkommen;
  };

};

int main()
{
  kunde
    frau,
    mann;

  frau.weiblich.koerbchengroesse = 'B';
  frau.weiblich.haarfarbe = blond;
  mann.einkommen = 1500.00;
}



AnyWare@Wachtler.de