我理解整个类型在C概念中定义一个结构,这样你就可以避免在使用它时使用关键字struct。我对这里发生的事情仍然感到有些困惑。
有人可以告诉我这个结构定义正在做的各种事情吗?
typedef struct work_tag {
//contents.
} work_t, *work_p;
答案 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_tag
和work_t
不是两种相似的类型,它们是完全相同类型的两个名称。
现在让我们讨论你为什么要这样做。
类型struct work_tag
和struct work_tag*
已经有了非常好的名字。 typedef
为您提供了一种使用单个标识符引用这些类型的方法,但在我看来,这并不是一个优势。而指针类型的typedef
实际上可能有点危险。如果要为真正的opaque类型定义名称,使用它的代码不会利用它是结构或指针的事实,typedef
是一个很好的解决方案;否则,你只是在暗示重要的信息。
我只想写:
struct work {
// contents
};
然后将类型称为struct work
,并将类型指向struct work*
。
但如果您真的觉得需要为该类型设置单字名称,则无需为标记和typedef使用不同的名称:
typedef struct work {
// contents
} work;
现在,您可以将类型引用为struct work
或work
,将指针类型引用为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 *