Die einfachste Form der Typ-Definition in C ist die Umbenennung eines bestehenden Typs, wie z.B.
Das kann die Lesbarkeit fördern, indem man z.B. Variablen wie folgt definiert:
Oder man verwendet Abkürzungen wie
Auf unserem 8-Bitter hätte eine Variable vom Typ
UINT dann einen Wertebereich von 0 bis 65535 - genau wie ein
unsigned int, nur ist es mit dem typedef halt kürzer. Manch einer mag argumentieren, dass man damit nur die Sprache verwässert und Verwirrung stiftet. Es gibt natürlich auch sinnvollere Anwendungen von typedef, wie folgende Typvereinbarung für einen Knoten in einem binären Baum zeigt:
Code: Alles auswählen
typedef struct tnode {
char *word;
int count;
struct tnode *left;
struct tnode *right;
} TREENODE, *TREEPTR;
Hier wurden gleich zwei Namen festgelegt,
TREENODE für die Struktur und
TREEPRT für einen Zeiger auf einen TREENODE. Eine Knoten-Variable legt man z.B. folgendermaßen fest:
Man hätte die Variable auch ohne typedef als
struct tnode t; anlegen können, aber es ist durchaus angenehm, dass das Schlüsselwort struct bei Verwendung von typedef entfällt. Schauen wir uns an, wie das Programm aus Kapitel 12 bei Verwendung von typedef aussieht - wir speichern es als
struct2.c:
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
// A book.
typedef struct {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book, *BookPtr;
/* Print a book.
Parameter: book pointer to the book to print
*/
void printBook(BookPtr book) {
printf( "title : %s\n", book->title);
printf( "author : %s\n", book->author);
printf( "subject : %s\n", book->subject);
printf( "book_id : %d\n", book->book_id);
}
/* Main.
*/
int main(void) {
Book book1;
Book book2;
/* book 1 specification */
strcpy(book1.title, "Programmieren in C");
strcpy(book1.author, "Kernighan & Ritchie");
strcpy(book1.subject, "Programmierlehrbuch");
book1.book_id = 5407;
/* book 2 specification */
strcpy(book2.title, "Telecom Billing");
strcpy(book2.author, "Zara Ali");
strcpy(book2.subject, "Telecom Billing Tutorial");
book2.book_id = 5700;
puts("*** Book 1 ***");
printBook(&book1);
puts("\n*** Book 2 ***");
printBook(&book2);
return 0;
}
Hier wurde auch gleich ein Pointer auf ein Book definiert, so dass die Funktion für die Ausgabe eines Buchs mit
void printBook(BookPtr book) beginnt. Ohne den Pointer-Typ hätte man auch
void printBook(Book *book) schreiben können.
Das Programm kompilieren wir zur Abwechslung mit
Code: Alles auswählen
zcc +cpm -subtype=pcw80 -lndos -create-app struct2.c -o struct2.com
Wir kennen bereits das Compiler-Frontend
zcc mit den Optionen
+cpm,
-subtype=pcw80 und
-create-app für die Schneider Joyce. Die Option
-lndos sorgt für eine kleinere ausführbare com-Datei, weil der Code für Dateizugriffsfunktionen weggelassen wird. Das können wir hier tun, weil wir keine Dateioperationen verwenden.