为什么结构标记名称与typedef名称有所不同?

时间:2010-03-01 09:41:00

标签: c struct

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

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

虽然我熟悉的常用模式是:

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

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

5 个答案:

答案 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 ++有特殊的措辞来处理这种重载的情况,这将是另一个复杂问题)。