Forum: PC-Programmierung Typedef und enum und struct


von Ma B. (drumstick)


Lesenswert?

Hallo!

Ich habe die Zusammenhänge von Typedef in Verbindung mit enum und struct 
noch nicht ganz begriffen!
1
typedef enum  { eSMUImain_pwrup,
2
                eSMUImain_stop,
3
                eSMUImain_run,
4
                eSMUImain_cal                
5
              }
6
        tSM_UI_main;
7
8
typedef enum  { eSMUIrun_stop,
9
                eSMUIrun_runCW,
10
                eSMUIrun_runCCW,
11
                eSMUIrun_runCDtoCW,
12
                eSMUIrun_runCDtoCCW
13
              }
14
        tSM_UI_run;
15
16
typedef struct{
17
                tSM_UI_main main;
18
                tSM_UI_run  run;
19
              }
20
        tSM_functions;

ich hoffe der codeausschnitt reicht. Struct und enum habe ich begriffen 
denke ich, aber warum macht man ein typedef enum und nicht nur ein enum?
daselbe mit struct?

danke und Gruss!

M.B.

von Rolf M. (rmagnus)


Lesenswert?

Das geht durchaus. typedef gibt einem Typ einen neuen, alternativen 
Namen. Bei deinen obigen Definitionen werden namenlose Strukturen und 
Enums erstellt, denen dann per typedef ein "alternativer" Name gegeben 
wird.
In C (nicht aber in C++) gibt es für Strukturen und Enums allerdings 
eigene Namensräume, so daß man bei einer Struktur mit Namen immer 
dazuschreiben muß, daß man sich auf eine struct bezieht. Das kann mit 
einem typedef umgangen werden.
1
struct s { int i; };
2
typedef struct s t;
3
4
struct s eins; // ok
5
s zwei; // Fehler, der Typ heißt "struct s" und nicht "s"
6
t drei; // ok

Ob das gut oder schlecht ist, darüber gibt es durchaus unterschiedliche 
Meinungen. Manche wollen nicht immer explzit das "struct" dazuschreiben 
müssen, andere finden es gut, wenn man an der Stelle gleich erkennen 
kann, daß es sich um eine struct handelt.

Für enum gilt natürlich das gleiche.

von Karl H. (kbuchegg)


Lesenswert?

Zunächst mal musst du die Dinge trennen.
typedef hat nichts mit enum oder struct oder union per se zu tun.

Wie ist die Sache in C.

Du vereinbarst eine struct
1
struct Koordinaten
2
{
3
  double x;
4
  double y;
5
};

gut.
Damit kannst du Variablen definieren, oder zb eine derartige Variable an 
eine Funktion übergeben
1
void foo( struct Koordinaten Punkt )
2
{
3
  printf( "%f, %f\n", Punkt.x, Punkt.y );
4
}
5
6
int main()
7
{
8
  struct Koordinaten Center;
9
10
  Center.x = 5;
11
  Center.y = 8;
12
13
  foo( Center );
14
}

soweit so gut.

Man kann auch in C eine struct definieren und gleichzeitig Variablen von 
diesem Typ anlegen
1
struct Coord
2
{
3
  double x;
4
  double y;
5
} Center, CircumPoint, A, B, C;

das vereinbart in einem Rutsch, dass Center, CircumPoint, A, B und C vom 
Datentyp struct Coord sind und auch gleich noch, wie diese Struktur 
aussieht.

Nun ist es aber so, dass in C der Name einer Struktur nicht automatisch 
der Name eines neuen Datentyps ist. Man muss also immer das struct mit 
dazu schreiben.
1
...
2
void foo( struct Koordinaten Punkt )
3
...
4
  struct Koordinaten Center;
5
...

und das kann dann ein wenig lästig sein.

An dieser Stelle betritt der typedef die Bühne.

Ein typedef schafft einen neuen Namen für einen Datentypen. Seine 
Anwendung ist ganz einfach: Schreib eine Variablendefinition hin, mach 
ein typedef davor und der Name der Variablen wird zum Namen dieses 
'neuen' Datentyps.
1
typedef double Real;
Das vereinbart also einen neuen Datentypen, der grundsätzlich ein double 
ist und fortan unter dem Namen 'Real' bekannt sein soll. Du kannst den 
benutzen, wie jeden anderen Datentypen
1
int main()
2
{
3
  Real x, y;
4
}
x und y sind vom Datentyp Real, welcher nichts anderes als ein anderer 
Name für double ist.

1
typedef char Hollodrio[40];
Hollodrio ist der neue Datentyp und er ist ein Array der Länge 40 von 
Charcatern.
1
int main()
2
{
3
  Hollodrio myString;
4
}
folgerichtig ist daher myString so ein Array von 40 Charactern.

Und jetzt zählen wir mal 2 und 2 zusammen

du hast eine Struktur
1
struct Koordinaten
2
{
3
  double x;
4
  double y;
5
};
und du hast einen typedef dafür
1
typedef struct Koordinaten Koord;
dann ist Koord ein anderer Name für den Datentyp 'struct Koordinaten'. 
Anstelle der langen Form von ganz oben, kannst du daher auch schreiben:
1
void foo( Koord Punkt )
2
{
3
  printf( "%f, %f\n", Punkt.x, Punkt.y );
4
}
5
6
int main()
7
{
8
  Koord Center;
9
10
  Center.x = 5;
11
  Center.y = 8;
12
13
  foo( Center );
14
}
ist genau dasselbe. Der typedef hat dafür gesorgt, dass nach ihm 'Koord' 
dasselbe ist wie 'struct Koordinaten'.

Bei einem typedef muss aber die Struktur noch nicht existieren. Du 
kannst ja auch Strukturdefinition und Variablen in einem Aufwasch 
definieren, wie weiter oben schon gezeigt.
Und da ein typedef sich an die Definition von Variablen hält, geht 
natürlich auch
1
typedef
2
  struct Koordinaten
3
  {
4
    double x;
5
    double y;
6
  } Koord;

ist genau dasselbe, nur in einem Aufwasch geschrieben. Koord wird als 
neuer Datentyp eingeführt und der Datentyp für den er steht (die 
Struktur) wird im typedef selber auch gleich definiert.

Tja. Und zu guter letzt gibt es noch einen Sonderfall, nämlich den, dass 
eine Struktur auch anonym sein kann, also keinen Strukturnamen benötigt
1
struct
2
{
3
  double x;
4
  doubly y;
5
} Center, CircumPoint, A, B, C;
vereinbart 5 Variablen, die diesen Aufbau haben ohne dafür dem Datentyp 
einen extra Namen zu geben.

Das wiederrum in den typedef integriert ergibt
1
typedef
2
  struct
3
  {
4
    double x;
5
    double y;
6
  } Koord;

und wir sind bei der Form, die du angetroffen hast.


Hat denn dein C-Buch dazu überhaupt nichts zu sagen? Normalerweise ist 
das was ich hier in Kurzform und dicht gedrängt erzählt habe etwas, was 
sich über mehrere Kapitel hinzieht und dort langsam und behutsam mit 
allen Sonderformen eingeführt wird.
Oder hast du gar kein C-Buch?

von Ma B. (drumstick)


Lesenswert?

Vielen Dank für die Antworten, sie sind sehr hilfreich!
Doch, ich habe das Buch "C von a bis z", ich finde es zum Teil nicht so 
gut beschrieben. Kennst Du ein besseres?

Vielen Dank und freundliche Grüsse!

M.B.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.