为什么struct的tagName经常与typedef的名称不同?

Dor*_*Dor 3 c struct

有时我会看到这样的代码(我希望我能正确记住它):

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)

那么第一个代码示例中的优势是什么?

unw*_*ind 6

你可能是这个意思:

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已经提供了自己的机制(星号)时,它尝试将某些东西(类型是指针的事实)编码到类型的名称中.显示这个.它使它非常混乱并打破了星号的对称性,这在声明使用指针时都会出现.

  • `typedef` ing`*`对于opaque类型很有用,它可以作为指针实现,但也可以作为数字ID实现; 如果做得合理,通过`typedef`隐藏的信息是一件好事 (2认同)