L'instruction typedef, qui sert à définir un nom comme l'abréviation d'un type, est généralement employée pour désigner par un nom un type dont l'expression est complexe, par exemple un type fonctionnel, un type de tableaux ou un type structure. L'abréviation
typedef double (*fun)(double);
fait du nom fun une abréviation du type des fonctions
Cette abréviation, où le * sera expliqué ultérieurement, est utilisable, par exemple pour déclarer le type d'un paramètre d'une fonction :
double newton(fun f, fun fprime, int n, double x0);
qui est plus concis que
double newton(double f(double),
double fprime(double),
int n, double x0);
De la même façon, l'abréviation rel du type des relations binaires sur les double s'exprime par :
typedef int (*rel)(double, double);
Une autre utilisation significative de typedef consiste à paramétrer un programme par un nom de type. Il suffira de modifier l'abréviation et le programme n'aura pas à être modifié par ailleurs. Cela permet de pallier partiellement l'absence de possibilités de typage générique en C. On écrira en tête du fichier :
typedef int data;
Le reste du programme n'utilisant que data, il suffira, le cas échéant, de remplacer cette définition de data par une autre, sans devoir modifier autre chose (sous réserve que les opérations sur les data aient toujours un sens pour autre chose que des int).
La syntaxe de ces abréviations est assez déroutante : on procède comme si l'on définissait une variable, le nom du type introduit étant à la place du nom de variable, et le tout est précédé de typedef.