Using own types for program evolution

Suppose you are using a char type for a variable. Later on you discover that it should better be a long type. But the knowledge about the "char" type is spread all over your program, e.g. by using "extern char ...". If you change the type of your variable you must change all these places in your software which know that the variable was a "char". Using a typedef and defining an alias for "char" with a program-specific meaning solves this problem.

Another advantage is that the MEANING of a variable can be much better communicated.

   typedef char* FileName;

   char* c = "ConfigFile";   // generic type name 
   FileName f = "ConfigFile"; // specific type name

Don't overdue this feature. A new type name is nice but the user (programmer) does not automatically know how it needs to be used. The usage of a char* is clear.