Директивы
#define
заменяются на ранних этапах процесса компиляции (фаза перевода 4, компиляция фактически не происходит до фазы 7, эти фазы и то, что происходит во время них, подробно описаны в стандарте, раздел 5.1.1.2).
То, что #define
просто изменит T
токены предварительной обработки на Stack_T
.
Эффект этого на typedef
будет превращать его в:
typedef struct Stack_T *Stack_T;
После этого Stack_T
определяется как тип, указатель на другой тип struct Stack_T
.Stack_T
и struct Stack_T
- это две разные вещи.