Welchen Sinn hat "typedef struct"

OP #7382757
Lesenswert?
• ▲
▼

Hallo, aus einem Beispielcode wird folgender code verwendet:

1
---------------------------------
2
typedef struct
3
{
4
    CLK_STATES clkstate;   // the current state
5
    int idlecnt;   // counts the number of times in the CLKS_STATE_IDLE
6
    unsigned int cpucycles;  // records the CPU cycles every second
7
    unsigned int last_CP0;  // the last core timer count
8
    int idlecntpersec;      // the idle count at the end of every second
9
} CLKDATA;
10
------------------------------------
11
CLKDATA clkData;
12
-----------------------------------
13
void CLKS_Initialize ( void )
14
{    
15
    clkData.cpucycles = 0;
16
    clkData.last_CP0 = 0;
17
    clkData.idlecnt = 0;
18
    clkData.idlecntpersec = 0;
19
    clkData.clkstate = CLKS_STATE_INIT;     
20
}
21
-------------------------------------

Frage: Welchen Vorteil bietet so etwas ? Warum nicht einfach normale Varriablennamen verwenden ? z.B.: cpucycles = 0; last_CP0 = 0;

[Mod: C-Code nachträglich formatiert]

#7382767
Lesenswert?
• ▲
▼

Eine Struktur dient dazu, mehrere funktional zusammengehörende Variablen zusammenzufassen.

Das ist schon dann sinnvoll, wenn man diese Variablen einer Funktion übergeben möchte:

1
typedef struct
2
{
3
    CLK_STATES clkstate;
4
    int idlecnt;
5
    unsigned int cpucycles; 
6
    unsigned int last_CP0; 
7
    int idlecntpersec;  
8
} CLKDATA;
9

10
// a: 
11

12
void meine_funktion_a(CLK_STATES clkstate, int idlecnt, unsigned int cpucycles, unsigned int last_CP0, int idlecntpersec);
13

14
// b:
15

16
void meine_funktion_b(CLKDATA clkdata);

Du siehst, daß die Parameterliste von meine_funktion_a unanständig lang wird.

Das ganze geht übrigend auch ohne typedef:

1
struct CLKDATA
2
{
3
    CLK_STATES clkstate;
4
    int idlecnt;
5
    unsigned int cpucycles; 
6
    unsigned int last_CP0; 
7
    int idlecntpersec;  
8
};
9

10
// a: 
11

12
void meine_funktion_a(CLK_STATES clkstate, int idlecnt, unsigned int cpucycles, unsigned int last_CP0, int idlecntpersec);
13

14
// b:
15

16
void meine_funktion_b(struct CLKDATA clkdata);

Durch das typedef spart man sich das Hinschreiben des Schlüsselworts "struct" und man kann die Typdefinition syntaktisch genauso verwenden, wie einen anderen Datentyp.

Du plenkst.

#7382789
Lesenswert?
• ▲
▼
1
typedef struct { 
2
...
3
} struct_typ;
4
struct_typ s;
5
s x;

Ist die Verbandelung einer Strukturdeklaration mit einem typedef und hat erst mal keinen Vorteil (ausser dass man sich u.U. ein wenig Tipparbeit spart, wenn man diesen Typ oft benutzt), weil man genauso gut auch

1
struct s
2
{
3
...
4
};
5
struct s x;

schreiben kann. Ich persönlich sehe keinen wirklich sinnvollen Grund, warum man für jede struct ein "typedef" erfinden müsste.

#7382955
Lesenswert?
• ▲
▼

Die Verwendung eines Structs eröffnet darüber hinaus einen neuen Namensraum für die enthaltenen Felder.

So werden die Felder, die zu CLKDATA gehören sauber abgekapselt und überschneiden sich global nicht namentlich.

1
struct CLKDATA
2
{
3
    CLK_STATES clkstate;
4
    int idlecnt;
5
    unsigned int cpucycles;
6
    unsigned int last_CP0;
7
    int idlecntpersec;
8
};
9

10
uint8_t clkstate;
#7383069
Lesenswert?
• ▲
▼

Also ich brauchs in meinem Fall nicht....

Du wirst es erst brauchen, wenn du mit einem dutzend Kollegen größere Programme entwickelst. Bei 100 Quelltexten, willst du nicht mehr die 100000 einzelnen Variablen kennen. Das wird viel zu aufwendig.

Der eine Kollege schreibt das CLKS_Initialize(), der andere den Hardware-Abstraction-Layer. Und du willst das einfach nur benutzen, willst dich nicht mehr um die 1000 internen Details kümmern.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.