Это практика, которая иногда выполняется в заголовках. #Define позволяет проверять существование typedef во время компиляции. Это позволяет код как:
#ifdef FOO_INT32
FOO_INT32 myfoo;
#else
int myfoo;
#endif
или как истинный охранник #define, аналогично охранникам заголовочного файла.
#ifndef FOO_INT32
typedef int FOO_INT32
#define FOO_INT32 FOO_INT32
#endif
Это не обязательно хорошая практика, но она имеет свои применения, особенно когда у вас есть некоторые заголовки, которые используют типы, определенные другими библиотеками, но вы хотите предоставить свои собственные замены для случаев, когда вы вообще не используете эти библиотеки .