有时我会看到这样的代码(我希望我能正确记住它):
typedef struct st {
int a; char b;
} *stp;
虽然我熟悉的常用模式是:
typedef struct st {
int a; char b;
} st;
那么第一个代码示例中的优势是什么?
答案 0 :(得分:6)
你可能是这个意思:
typedef struct ST {
/* fields omitted */
} *STP;
星号位于声明的末尾。这只是意味着“将类型STP定义为指向此类结构的指针”。不需要struct标记(ST
),只有在以后想要能够自己引用结构类型时才有用。
你也可以同时拥有这两个:
typedef struct {
/* fields omitted */
} ST, *STP;
这样就可以使用ST
来引用结构类型本身,并使用STP
来指向ST
。
我个人认为在typedef中包含星号是一种非常糟糕的做法,因为当C已经提供了自己的机制时,它会尝试将某些东西(类型是指针的事实)编码到类型的名称中(星号)来表明这一点。这使得它非常混乱并打破了星号的对称性,它出现在声明和指针的使用中。
答案 1 :(得分:3)
这是一种习惯,源于typedef名称和结构标记名在同一名称空间中的时间。见http://blogs.msdn.com/oldnewthing/archive/2008/03/26/8336829.aspx
答案 2 :(得分:2)
我认为你在谈论:
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更加直观并且轻松可以使用。
答案 3 :(得分:1)
我希望第一个代码会说编译错误,
答案 4 :(得分:0)
我认为typedef名称与标签名称不同是没有充分理由的。
现在,如果您不想使用
,则需要对标签名称进行typedefed的原因struct tag v;
但
tag v;
可能是历史性的。只要我记得,C有typedef,但我不知道引入struct
时是否属实(处理typedef是C语法中的一个麻烦)。在我看过的旧代码中,使用typedef for struct没有完成,还有像unix这样的东西
struct stat;
int stat(const char*, struct stat*);
会破坏自动typedef。引入其中一个,改变是非常困难的(是的,C ++有自动typedef,但C ++有特殊的措辞来处理这种重载的情况,这将是另一个复杂问题)。