Ответ прост: вы создаете новый тип данных с помощью typedef.
Давайте рассмотрим простой пример: во встроенной системе мы используем только числа без знака.Теперь 1 способ - я пишу
unsigned int xyz;
Так что здесь я должен был бы везде печатать unsigned .. Что, если я забуду где-нибудь напечатать unsigned, очень трудно понять, что если код будет выпущен.Таким простым способом будет
typedef unsigned int uint;
Так что теперь вы можете использовать uint в качестве типа данных.Поэтому, когда парсер встречает uint, он читает его как беззнаковое целое.
Так что в вашем случае вы можете использовать P в качестве типа данных в коде.Как и в первом примере,
P xyz ;
будет проанализирован как
int (*xyz)(char *(*)());