这个语法到底是做什么的? (关于c式结构)

时间:2012-01-18 23:06:15

标签: c

我理解整个类型在C概念中定义一个结构,这样你就可以避免在使用它时使用关键字struct。我对这里发生的事情仍然感到有些困惑。

有人可以告诉我这个结构定义正在做的各种事情吗?

typedef struct work_tag {
    //contents.
} work_t, *work_p;

4 个答案:

答案 0 :(得分:9)

它定义了两个typedef,例如:

typedef struct work_tag {
    //contents.
} work_t;

typedef struct work_tag *work_p;

答案 1 :(得分:3)

正如其他答案所说,它定义了两个typedef,一个名为work_t,引用struct work_tag,另一个名称work_p引用struct work_tag*

请注意,typedef不会创建新类型。它所做的只是为现有类型创建别名struct work_tagwork_t不是两种相似的类型,它们是完全相同类型的两个名称。

现在让我们讨论你为什么要这样做。

类型struct work_tagstruct work_tag*已经有了非常好的名字。 typedef为您提供了一种使用单个标识符引用这些类型的方法,但在我看来,这并不是一个优势。而指针类型的typedef实际上可能有点危险。如果要为真正的opaque类型定义名称,使用它的代码不会利用它是结构或指针的事实,typedef是一个很好的解决方案;否则,你只是在暗示重要的信息。

我只想写:

struct work {
    // contents
};

然后将类型称为struct work,并将类型指向struct work*

但如果您真的觉得需要为该类型设置单字名称,则无需为标记和typedef使用不同的名称:

typedef struct work {
    // contents
} work;

现在,您可以将类型引用为struct workwork,将指针类型引用为struct work*work*。 (C ++隐式执行此操作; C不执行此操作。)请注意,如果struct work包含指向另一个struct work的指针,则不能在定义中使用typedef名称;在定义结束之前,typedef名称不可见。

答案 2 :(得分:2)

typedef视为变量声明。就像您可以int a, b制作两个int变量一样,您可以typedef int a_t, b_t在一个typedef中制作两种类型。

答案 3 :(得分:1)

它为现有类型分配了两个替代名称:

work_t -> struct work_tag
work_p -> struct work_tag *