被#define和typedef混淆

#define T Stack_T typedef struct T *T; 

那么struct T是什么意思,# #definetypedef定义的那个?

#define指令在编译过程的早期被替换(转换阶段4,直到阶段7才实际编译,这些阶段及其中发生的事情在标准的第5.1.1.2节中详细说明)。

#define只会将T预处理标记更改为Stack_T

这对typedef将是:

 typedef struct Stack_T *Stack_T; 

在此之后, Stack_T被定义为一种类型,指向另一种类型的struct Stack_T的指针。 Stack_Tstruct Stack_T是两个不同的东西。

预处理器只进行文本替换,因此代码看起来像

 typedef struct Stack_T *Stack_T; 

因此,代码中的每个T首先被替换为Stack_T ,然后编译器启动,查看typedef并使用struct Stack_T*

可能很高兴知道struct TypeType在C ++中只是相同,而不是在C中。

由于#define在预编译中处理,而struct在编译中处理,因此在预编译之后你将拥有typedef struct T *T; 看起来像这样: typedef struct Stack_T *Stack_T;

T表示Stack_T因此,您可以将typedef读取为:

 typdef struct Stack_T *Stack_T; 

所以在编译器编译期间,代码中的每个T都被替换为Stack_T