Linux C Programmieranleitung Teil 28 – Typedefs

In diesem Tutorial – das Teil der laufenden C-Programmier-Tutorialreihe ist – werden wir das Konzept von typedef diskutieren. Wie der Name schon sagt (man stelle sich typedef als type+def vor), ist typedef eine in C angebotene Möglichkeit, neue Namen für bestehende Datentypen zu definieren.

Eingetippt in der Programmiersprache C

Hier ist ein Beispiel, das zeigt, wie typedef verwendet werden kann:

typedef int my_int

Die obige Zeile – die mit dem Schlüsselwort ‚typedef‘ beginnt – gibt dem Datentyp ‚int‘ einen neuen Namen: ‚my_int‘. Also, ein Code wie dieser:

#include <stdio.h>

int main()
{
int a = 10;
printf(„The value of a is: %d“, a);

return 0;
}

Kann wie folgt geschrieben werden, wenn man das gerade besprochene typedef Beispiel verwendet:

#include <stdio.h>

typedef int my_int;

int main()
{
my_int a = 10;
printf(„The value of a is: %d“, a);

return 0;
}

Nun, eine Frage, die manche vielleicht stellen, ist, was der Unterschied zwischen einem typedef und einem #define ist? Nun, während beide ähnlich zu sein scheinen, gibt es tatsächlich einige Unterschiede zwischen den beiden.

Zuerst einmal wird typedef vom Compiler interpretiert, während ein #define es nie bis zur Kompilierungsphase schafft, da es in der Vorverarbeitungsphase selbst interpretiert wird. Dann folgt ein typedef den Scope Regeln, ein #define hingegen nicht. Nachfolgend ein Beispiel dafür:

#include <stdio.h>

void my_func();

int main()
{
typedef int my_int;
my_int a = 10;
printf(„The value of a is: %d“, a);
my_func();

return 0;
}

void my_func()
{
my_int b = 20;
printf(„The value of a is: %d“, b);

return;
}

Wenn dieser Code ausgeführt wird, erhalten Sie den folgenden Fehler:

main.c: In function ‘my_func’:
main.c:25:5: error: unknown type name ‘my_int’
 my_int b = 20;
 ^

Wie Sie sehen können, konnte der Compiler den Typ ‚my_int‘ in der ‚my_func‘ Funktion nicht erkennen, da der Gültigkeitsbereich von typedef der der ‚main‘ Funktion war.

Dann gibt es noch einige andere Unterschiede zwischen einem typedef und einem #define. Mit einem #define können Sie auch Aliase für konstante Werte erstellen – ich meine, Sie können etwas wie ‚#define PIE 3.14‘ machen. Außerdem wird ein #define nicht durch ein Semikolon beendet, während ein typedef ist, wie Sie beobachtet haben.

Nun würde man immer noch fragen, warum wir ‚typedef‘ brauchen. Oder mit anderen Worten, wo kommt ein Typedef richtig gelegen? Nun, nehmen wir an, es gibt ein Stück Code mit Funktionen, die ‚Zeiger auf eine Funktion, die zwei ganze Zahlen als Argumente akzeptiert, als Rückgabe eines Zeichenwertes‘ zurückgeben.

Falls Sie es nicht wissen, wird ein solcher Zeiger auf folgende Weise deklariert:

char (*fn_ptr) (int, int);

Wobei fn_ptr der Name eines solchen Zeigers ist.

Anstatt also diese Art von langwieriger und komplexer Deklaration immer wieder als Rückgabetyp für andere Funktionen zu verwenden, können Sie fn_ptr einfach mit typedef zu einem Typ machen:

typedef char (*fn_ptr) (int, int);

Und jetzt können Sie einfach ‚fn_ptr‘ benutzen, und es wird einen Zeiger dieses Typs bezeichnen.

Eine andere Verwendung von typedef beinhaltet die Verwendung eines benutzerdefinierten Datentyps im Code, der dem nativen Typ entspricht, der von der zugrunde liegenden Plattform, auf der der Code läuft, bereitgestellt wird. Auf diese Weise helfen Typedefs dabei, jedes Stück Code, das für die Ausführung auf verschiedenen Plattformen entwickelt wurde, leicht verständlich und pflegbar zu machen.

Fazit

In diesem Tutorial haben wir also die Grundlagen von typedefs besprochen, einschließlich dessen, was typedef tut, wie es sich von einer #define Direktive unterscheidet und wie typedefs Ihren Tag retten kann, indem sie den Code leicht lesbar, verständlich und wartungsfreundlich machen.

Wir empfehlen Ihnen, die hier verwendeten Beispiele auszuprobieren und weitere Beispiele zu entwickeln, um ein besseres Verständnis der Typedefs zu bekommen, und wie immer, im Zweifelsfall oder bei Fragen, einen Kommentar unten einzufügen.

Das könnte Dich auch interessieren …