有时我会看到这样的代码(我希望我能正确记住它):
typedef struct st {
int a; char b;
} *stp;
Run Code Online (Sandbox Code Playgroud)
虽然我熟悉的通常模式是:
typedef struct st {
int a; char b;
} st;
Run Code Online (Sandbox Code Playgroud)
那么第一个代码示例中的优势是什么?
你可能是这个意思:
typedef struct ST {
/* fields omitted */
} *STP;
Run Code Online (Sandbox Code Playgroud)
星号位于声明的末尾.这只是意味着"将类型STP定义为指向此类结构的指针".ST不需要struct tag(),它只在您希望能够稍后引用结构类型时才有用.
你也可以同时拥有这两个:
typedef struct {
/* fields omitted */
} ST, *STP;
Run Code Online (Sandbox Code Playgroud)
这样就可以用来ST引用结构类型本身,以及STP指向它的指针ST.
我个人认为在typedef中包含星号是一种非常糟糕的做法,因为当C已经提供了自己的机制(星号)时,它尝试将某些东西(类型是指针的事实)编码到类型的名称中.显示这个.它使它非常混乱并打破了星号的对称性,这在声明和使用指针时都会出现.