typedef

Dieser Teil von ManderC ist noch in Bearbeitung

Deklarationen mit Speicherklassen

In manchen Quellen kann nachgelesen werden, dass typedef eine Speicherklasse representiert, was von der Funktionsweise dieses Keywords her jedoch keinen Sinn ergibt. Dies führt zu Verwirrung, der Autor hat jedoch folgende Erklärung (die, man möge mich korrigieren, falsch sein kann):

Ein Typ darf unter keinen Umständen zwei Speicherklassen definieren, denn der Compiler muss wissen, wo Alloziiert und Dealloziiert werden soll. Mittels typedef ist es jedoch (zumindest auf dem System des Autors) möglich, beispielsweise folgenden Typ herzustellen:

typedef register int strangetype;

Fügt man diese Zeile in ein C-Programm ein, so entsteht tatsächlich der Fehler multiple storage classes in declaration specifiers. Unter C++ jedoch kompiliert dieses Konstrukt fehlerlos (was möglicherweise ein Fehler im Compiler ist). Was nun in C++ passieren kann, ist folgendes: Anhand dieser Typdefinition können weitere Variablen deklariert werden. Fügt man nun zu einer solchen Deklaration eine weitere Speicherklasse hinzu, so entsteht beispielsweise folgendes Programm:

#include <stdio.h> typedef register int strangetype; void printnumber(){ static strangetype x = 0; x++; printf("%d\n", x); } int main(int argc, char** argv){ printnumber(); printnumber(); return 0; }

1 2

Somit wurde die Variable x in der Funktion printnumber definiert als:

static register int x = 0;

Würde man diese Deklaration so hinschreiben, würde der Compiler dies mittels obengenannten Fehler bemängeln. Dreht man nun um des Experimentes willen die Speicherklassen um, so entsteht folgendes Programm:

#include <stdio.h> typedef static int strangetype; void printnumber(){ register strangetype x = 0; x++; printf("%d\n", x); } int main(int argc, char** argv){ printnumber(); printnumber(); return 0; }

1 1

Der deklarierte Typ entspricht hierbei folgender Zeile:

register static int x = 0;

Die Unterschiede in der Ausgabe lassen sich nun so erklären, dass eine frisch definierte Speicherklasse die alte überschreibt. Im ersten Beispiel wird somit aus einer Register-Variablen eine statische Variable, weswegen sie nur einmal mit 0 initialisiert wird und dann zweimal hintereinander um 1 erhöht wird. Im zweiten Beispiel hingegen wurde aus einer statischen Variablen plötzlich ein Register, welches bei jedem Aufruf der Funktion neu auf 0 initialisiert wird und somit zweimal den Wert 1 ergibt.

Es ist somit zu empfehlen, Speicherklassen bei typedef-Angaben zu vermeiden und stattdessen die Speicherklassen bei der eigentlichen Deklaration anzugeben.