Matthias M. schrieb:
> typedef Byte (*LCD_FontCallback)(Byte*);
>
> Ja, das ist ein ganz übler Syntax weil nicht offensichtlich.
>
> Was "typedef unsigned int uint;" macht, ist klar, oder? Der Typ "uint"
> kann jetzt anstatt "unsigned int" verwendet werden, bedeutet aber das
> selbe.
>
> Links steht also der existierende Typ, recht steht der neue Name.
<Nitpicking>
Erklär es nicht mit Ausdrücken wie 'links' und 'rechts'.
Ein typedef funktioniert im Grunde so, dass man sich die Definition
einer Variablen vorstellt, die vom gesuchten Typ sein sein.
Schreibt man dieser Variablendefinition dann ein 'typedef' davor, dann
mutiert der Name der Variablen zum Namen eines neues Datentyps, der ein
Alias für diesen Datentyp sein soll.
Da man eine unsigned int Variable so definieren würde
wird der Name an der Stelle 'myVar' durch Voranstellen von 'typedef' zum
Namen des neuen Datentyps
1 | typedef unsigned int uint;
|
Da man ein Array der Länge 20 vom char so definieren würde
erhält man durch Voranstellen von 'typedef' einen neuen Datentyp
einen neuen Datentyp namens 'str', der den Datentyp 'Array von 20 char'
repräsentiert.
Da man einen Funktionspointer mit dem Namen Callback als Variable so
definieren würde
1 | void (*Callback)( void );
|
(für Funktionen die keine Argumente nehmen und auch keinen Rückgabewert
liefern), wird das ganze durch Voranstellen von 'typedef'
1 | typedef (*callbackFnct)(void);
|
zu einem neuen Datentyp namens 'callbackFnct', der ein Alias für den
genannten Datentyp eines Funktionspointers ist.
Und ja: Anzahl Argumente, Datentyp der Argumente und Datentyp des
Rückgabewertes sind alles Bestandteile des Typs eines Funktionspointers.
Das ist die Idee hinter 'typedef': Nimm eine geeignete Definition einer
Variablen mit genau dem Typ den du brauchst und stelle diesem ein
typedef davor. Dann mutiert der Name der Variable zum Namen des neuen
einzuführenden Datentyp-Names, der einen Alias dazu darstellt.
Alias == andere Schreibweise.