Typedef is very useful for portable names, tag names (typedef struct foo Foo;) and keeping complicated (function) declarations readable (typedef int (*cmpfunc
typedef struct foo Foo;
typedef int (*cmpfunc
it is definitely required, a good example is size_t which is typedef'd on various platforms.