为什么经常使用struct';s标记名不同于typedef';她叫什么名字?

为什么经常使用struct';s标记名不同于typedef';她叫什么名字?,c,struct,C,Struct,有时我会看到这样的代码(我希望我记得正确): 我熟悉的通常模式是: typedef struct st { int a; char b; } st; 那么,第一个代码示例的优点是什么呢?我希望第一个代码会说是编译器错误,您的意思可能是: typedef struct ST { /* fields omitted */ } *STP; 星号在语句的末尾。这仅仅意味着“将类型STP定义为指向此类型结构的指针”。struct标记(ST)是不需要的,它只在您希望以后能够单独引用结构类型时

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

我熟悉的通常模式是:

typedef struct st {
    int a; char b;
} st;

那么,第一个代码示例的优点是什么呢?

我希望第一个代码会说是编译器错误,

您的意思可能是:

typedef struct ST {
  /* fields omitted */
} *STP;
星号在语句的末尾。这仅仅意味着“将类型STP定义为指向此类型结构的指针”。struct标记(
ST
)是不需要的,它只在您希望以后能够单独引用结构类型时才有用

你也可以两者兼得,就像这样:

typedef struct {
  /* fields omitted */
} ST, *STP;
这样就可以使用
ST
引用结构类型本身,使用
STP
引用指向
ST
的指针


就我个人而言,我发现在typedefs中包含星号是一种非常糟糕的做法,因为它试图将某些东西(类型是指针的事实)编码到类型名称中,而C已经提供了自己的机制(星号)来显示这一点。它使它变得非常混乱,破坏了星号的对称性,星号出现在声明和指针的使用中。

我想你说的是:

typedef struct{
   int a;
   char b;
} object, *objectPointer;
这意味着(新)类型objectPointer是指向上面定义的
struct
(对象)的指针。以这种方式声明指向对象
struct
的指针很容易。例如,

objectPointer A = (objectPointer)malloc(sizeof(object));
A->a = 2;
现在,A是指向struct对象的指针,您可以如上所述访问它的变量。

在这种情况下,未定义objectPointer,
struct object *A = (struct object *)malloc(sizeof(object));
A->a = 2;

因此,我想objectPointer更直观、更易于使用。

这是一种习惯,源于typedef名称和struct标记名位于同一名称空间的时候。请参见

我看不出typedef名称与标记名称不同的充分理由

现在,如果您不想使用,那么需要对标记名进行typedef的原因是什么

struct tag v;
但是

可能是历史性的。在我记忆中,C有typedef,但我不知道在引入
struct
时它是否正确(处理typedef在C语法中是一件麻烦事)。在我所看到的旧代码中,没有为struct使用typedef,还有一些类似unix的东西

struct stat;
int stat(const char*, struct stat*);

这将与自动typedef中断。一个被引入的,改变是相当困难的(是的,C++有自动的TyBufff,但是C++有特殊的措辞来处理重载的情况,这将是另一个复杂的问题)。p> 星号在源代码中真的是星号吗?还是通配符?请把它当作通配符。出于某种原因,我记得有一个星号,但它不能编译。你是指
struct\u st
而不是
struct*st
?很可能你的意思如下,正如解开的回答:typedef struct st{int a;char b;}*stp;你为什么不编辑这个问题,让它变得有意义?现在你知道你想问什么了?不,这意味着
object
类型的东西是指向
struct\u object
+1的指针。在第一段代码中:是否在结构的末尾省略了分号?(第四行)@Dor:是的。结构后的分号。是否有其他引用暗示有这样一个时间?我将尝试在DMR主页和其他一些我已经看过的旧文档中挖掘出来。确认。我不记得了。(我记得,成员名称空间对于所有结构和联合都是唯一的,它解释了UNIX结构中成员名称的前缀)。不,但是我认为OLDNeWestRead相当可靠。<代码> TyBuffs< /Eng>代码> */Cord>对于不透明类型是有用的,它可能被实现为指针,但也可以实现为数字ID;如果做得明智,通过
typedef
隐藏信息是一件好事
tag v;
struct stat;
int stat(const char*, struct stat*);