Wozu dient typedef?

Lesezeit: 6 Minuten

Benutzeravatar von hks
hk

Was ist die Verwendung des Schlüsselworts typedef in C? Wann wird es benötigt?

typedef ist für die Definition von etwas als a Typ. Zum Beispiel:

typedef struct {
  int a;
  int b;
} THINGY;

…definiert THINGY wie die gegebene Struktur. Auf diese Weise können Sie es wie folgt verwenden:

THINGY t;

…statt:

struct _THINGY_STRUCT {
  int a;
  int b;
};

struct _THINGY_STRUCT t;

…was etwas ausführlicher ist. typedefs können einige Dinge machen dramatisch übersichtlicher, insbesondere Zeiger auf Funktionen.

  • Gibt es jemals einen Grund, es nicht zu tun? typedef a struct dann?

    – Panzerkrise

    28. September 2014 um 4:37 Uhr

  • @Panzercrisis: Mir ist keine bekannt, sicherlich habe ich es routinemäßig ~ 1989-1998 gemacht (die Jahre, in denen ich den größten Teil meiner C-Arbeit gemacht habe), aber ich bin kein C-Experte (mehr).

    – TJ Crowder

    28. September 2014 um 8:08 Uhr

  • Aber in der Regel alle Untertypen der struct wäre typedefs einfacher Typen wie short oder double und manchmal sind das typedefs von typedefs, das Sie auf eine Hasenjagd durch verschiedene schickt .h Dateien, an deren Ende Sie vergessen haben, wofür sie verwendet wurden, und Sie müssen dies tun jede Variable. Sie sind ein Albtraum!

    – CpILL

    25. April 2019 um 0:28 Uhr

Aus Wikipedia:

typedef ist ein Schlüsselwort in den Programmiersprachen C und C++. Der Zweck von typedef besteht darin, bestehenden Typen alternative Namen zuzuweisen, meistens solchen, deren Standarddeklaration umständlich oder möglicherweise verwirrend ist oder die wahrscheinlich von einer Implementierung zur anderen variieren.

Und:

K&R gibt an, dass es zwei Gründe für die Verwendung eines Typedef gibt. Erstens stellt es ein Mittel bereit, um ein Programm portabler zu machen. Anstatt einen Typ überall in den Quelldateien des Programms ändern zu müssen, muss nur eine einzige typedef-Anweisung geändert werden. Zweitens kann ein Typedef eine komplexe Deklaration verständlicher machen.

Und ein Argument dagegen:

Er (Greg KH) argumentiert, dass diese Praxis nicht nur Code unnötig verschleiert, sondern auch dazu führen kann, dass Programmierer versehentlich große Strukturen missbrauchen, weil sie sie für einfache Typen halten.

  • Ich stimme Greg KH vollkommen zu, siehe meinen Kommentar unter @TJCrowder. Ich denke, es ist eine schlechte Praxis und sie sollten minimal verwendet werden

    – CpILL

    25. April 2019 um 0:30 Uhr

andyns Benutzeravatar
andyn

Typedef wird zum Erstellen verwendet Aliase für vorhandene Typen. Es ist ein bisschen ein falsche Bezeichnung: typedef definiert keine neuen Typen, da die neuen Typen mit dem zugrunde liegenden Typ austauschbar sind. Typedefs werden häufig aus Gründen der Klarheit und Portabilität in Schnittstellendefinitionen verwendet, wenn der zugrunde liegende Typ Änderungen unterliegt oder nicht von Bedeutung ist.

Zum Beispiel:

// Possibly useful in POSIX:
typedef int filedescriptor_t;

// Define a struct foo and then give it a typedef...
struct foo { int i; };
typedef struct foo foo_t;

// ...or just define everything in one go.
typedef struct bar { int i; } bar_t;

// Typedef is very, very useful with function pointers:
typedef int (*CompareFunction)(char const *, char const *);
CompareFunction c = strcmp;

Typedef kann auch verwendet werden, um unbenannten Typen Namen zu geben. In solchen Fällen ist typedef der einzige Name für diesen Typ:

typedef struct { int i; } data_t;
typedef enum { YES, NO, FILE_NOT_FOUND } return_code_t;

Namenskonventionen sind unterschiedlich. Normalerweise wird empfohlen, a zu verwenden trailing_underscore_and_t oder CamelCase.

  • Wie hier beschrieben, ist es nicht empfehlenswert, eigene Typen mit _t zu benennen: stackoverflow.com/a/231807/2985095

    – Gregor Arenius

    15. August 2018 um 0:03 Uhr

Erläutern der Verwendung von typedef im folgenden Beispiel. Außerdem wird Typedef verwendet, um den Code besser lesbar zu machen.

#include <stdio.h>
#include <math.h>

/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/

// typedef a primitive data type
typedef double distance;

// typedef struct 
typedef struct{
    int x;
    int y;
} point;

//typedef an array 
typedef point points[100]; 

points ps = {0}; // ps is an array of 100 point 

// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)

// prototype a function     
distance findDistance(point, point);

int main(int argc, char const *argv[])
{
    // delcare a function pointer 
    distanceFun_p func_p;

    // initialize the function pointer with a function address
    func_p = findDistance;

    // initialize two point variables 
    point p1 = {0,0} , p2 = {1,1};

    // call the function through the pointer
    distance d = func_p(p1,p2);

    printf("the distance is %f\n", d );

    return 0;
}

distance findDistance(point p1, point p2)
{
distance xdiff =  p1.x - p2.x;
distance ydiff =  p1.y - p2.y;

return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
} In front of everything, place the keyword typedef.
    */

typedef führt keinen neuen Typ ein, sondern stellt nur einen neuen Namen für einen Typ bereit.

TYPEDEF KANN VERWENDET WERDEN FÜR:

  1. Typen, die Arrays, Strukturen, Zeiger oder Funktionen kombinieren.

  2. Um die Portabilität zu erleichtern, typedef den Typ, den Sie benötigen. Wenn Sie dann den Code auf verschiedene Plattformen portieren, wählen Sie den richtigen Typ aus, indem Sie nur Änderungen in der Typdefinition vornehmen.

  3. EIN typedef kann einen einfachen Namen für eine komplizierte Typumwandlung bereitstellen.

  4. typedef kann auch verwendet werden, um unbenannten Typen Namen zu geben. In solchen Fällen ist typedef der einzige Name für diesen Typ.

HINWEIS:-SOLLTE NICHT VERWENDEN TYPEDEF MIT STRUKTUREN. VERWENDEN SIE IMMER EIN TAG IN EINER STRUKTURDEFINITION, SELBST WENN ES NICHT ERFORDERLICH IST.

  • Könnten Sie bitte erläutern, dass Sie typedef nicht mit Strukturen verwenden?

    – Matwej Aksenow

    30. Juli 2014 um 17:22 Uhr

Benutzeravatar von Dhruv Joshi
Dhruv Joshi

aus Wikipedia: “K&R gibt an, dass es zwei Gründe für die Verwendung einer Typedef gibt. Erstens … . Zweitens kann eine Typedef eine komplexe Deklaration leichter verständlich machen.”

Hier ist ein Beispiel für den zweiten Grund für die Verwendung von typedef, die Vereinfachung komplexer Typen (der komplexe Typ stammt aus K&R “The C Programming Language Second Edition S. 136).

char (*(*x())[])()

x ist eine Funktion, die einen Zeiger auf ein Array zurückgibt[] des Zeigers auf die Funktion, die char zurückgibt.

Die obige Deklaration können wir mit typedefs verständlich machen. Bitte sehen Sie sich das Beispiel unten an.

typedef char (*pfType)(); // pf is the type of pointer to function returning
                          // char
typedef pfType pArrType[2];  // pArr is the type of array of pointers to
                             // functions returning char

char charf()
{ return('b');
}

pArrType pArr={charf,charf};
pfType *FinalF()     // f is a function returning pointer to array of
                     // pointer to function returning char
{
return(pArr);
}

  • Könnten Sie bitte erläutern, dass Sie typedef nicht mit Strukturen verwenden?

    – Matwej Aksenow

    30. Juli 2014 um 17:22 Uhr

Benutzeravatar von Andreas Bonini
Andreas Bonini

Es kann einen anderen Typ aliasieren.

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */

  • OP fragt warum nicht wie

    – CpILL

    25. April 2019 um 0:42 Uhr

1412400cookie-checkWozu dient typedef?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy