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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren