被#define和typedef混淆
#define T Stack_T typedef struct T *T;
那么struct T
是什么意思,# #define
或typedef
定义的那个?
#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
是两个不同的东西。
预处理器只进行文本替换,因此代码看起来像
typedef struct Stack_T *Stack_T;
因此,代码中的每个T
首先被替换为Stack_T
,然后编译器启动,查看typedef
并使用struct Stack_T*
。
可能很高兴知道struct Type
和Type
在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
。