6 STRUKTURY______
Ćwiczenie 6.5. Napisz funkcję undef, która usuwa nazwę i jej definicję z tablicy obsługiwanej przez funkcje lookup i install.
Ćwiczenie 6.6. Skonstruuj prostą wersję preprocesora obsługującego intrukcje #define (bezargumentowe), działającego na programach napisanych w języku C. Zastosuj funkcje opisane w tym rozdziale. Możesz też skorzystać z funkcji getch i ungetch.
W języku C wprowadzono mechanizm, zwany typedef, do tworzenia nowych nazw typów danych. Na przykład deklaracja
typedef int Lenght; /* Długość */
tworzy dla typu int synonim Lenght. Z typu Lenght można korzystać w deklaracjach, rzutowaniach itp. dokładnie tak samo, jak z typu int:
Lenght len, maxlen;
Lenght *lenghts[ ];
Podobnie deklaracja
typedef char *String; /* Tekst */
wprowadza synonim String dla typu char *, z którego można później korzystać w deklaracjach i rzutowaniu, np.
String p, lineptr[MAXLINES], alloc(int); int strcmp(String, String); p = (String) malloc(100);
Zwróć uwagę, że typ deklarowany w typedef pojawia się w miejscu nazwy zmiennej, a nie tuż za słowem typedef. Składniowo słowo typedef odpowiada klasie pamięć, jak extern, static itp. Aby wyróżnić nazwy definiowanych typów, rozpoczynamy }t wielką literą.
• _
Bardziej skomplikowanym przykładem może być użycie typedef do definiowani-węzłów drzewa opisanego wcześniej w tym rozdziale:
6.7 deklaracja typedef__
powered by
Mi siol
typedef struct tnode *Treeptr; /* Wskaźnik do węzła */
typedef struct tnode { char *word; int count;
Treeptr left;
Treeptr right;
} Treenode;
I* węzeł drzewa: */
/* wskaźnik do tekstu słowa */ /* licznik wystąpień */
/* lewy potomek */
/* prawy potomek */
/* Węzeł */
Obie deklaracje tworzą dwa nowe słowa kluczowe typów: Treenode (struktura) oraz Treeptr (wskaźnik do takiej struktury). Zatem procedurę talloc można napisać tak:
J
Treeptr talloc(void)
return(Treeptr) malloc(sizeof(Treenode));
Należy podkreślić, że deklaracja typedef w żadnym sensie nie tworzy nowego typu; ona po prostu daje nową nazwę dla pewnego już istniejącego typu. Nie ma tu także żadnej nowej semantyki: zmienne deklarowane w ten sposób mają dokładnie te same właściwości co zmienne, których deklaracje zostały podane szczegółowo. Deklaracja typedef jest w istocie podobna do #define z tą różnicą, że jest interpretowana przez kompilator, a więc może uczestniczyć w podstawieniach tekstowych, które są poza możliwościami preprocesora języka C. Na przykład deklaracja
typedef int (*PFI) (char *, char *);
tworzy typ o nazwie PFI jako „wskaźnik do funkcji zwracającej wartość typu int (o dwóch argumentach typu char *)”. Możemy go stosować w takich kontekstach, jak
PFI strcmp, numcmp;
(zamiast prototypów tych funkcji) w programie sortującym z rozdz. 5.
Poza skutkiem czysto estetycznym są dwa główne powody przemawiające za używaniem deklaracji typedef. Pierwszy dotyczy parametryzacji programu w związku z problemem przenoszenia oprogramowania. Jeżeli deklaracje typedef są stosowane dla tych typów danych, które mogą zależeć od maszyny, to tylko te deklaracje będą wymagać zmiany przy przenoszeniu programu. Jedną z częściej spotykanych sytuacji jest użycie typedef do zdefiniowania nazw różnych wielkości całkowitych, a następnie dokonanie
197