为什么经常使用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*);