这个语法究竟做了什么? (关于C风格的结构)
我理解C语言中定义结构的整个类型,以便您可以避免在使用关键字struct时使用它。尽管如此,我仍然对这里发生的一切感到困惑。这个语法究竟做了什么? (关于C风格的结构)
有人能告诉我这个结构定义正在做的各种事情吗?
typedef struct work_tag {
//contents.
} work_t, *work_p;
它定义了两个类型定义,如:
typedef struct work_tag {
//contents.
} work_t;
typedef struct work_tag *work_p;
它分配两个备选名称现有类型:
work_t -> struct work_tag
work_p -> struct work_tag *
一个typedef
像一个变量声明的思考。就像你可以做int a, b
来创建两个int
变量一样,你可以做typedef int a_t, b_t
在一个typedef
中做两种类型。
正如其他答案所说,它定义了两个typedefs,一个名为work_t
,指的是struct work_tag
,另一个名称是work_p
,指的是struct work_tag*
。
请注意,typedef
不会创建新类型。它所做的就是为现有类型创建一个别名。 struct work_tag
和work_t
不是两个相似的类型,它们是的两个名字,正好是的同一类型。
现在让我们来讨论一下你为什么要这样做。
struct work_tag
和struct work_tag*
类型已经有完美的名字。 A typedef
为您提供了一种使用单一标识符来引用这些类型的方法,但在我看来,这并没有太大的优势。而指针类型的typedef
实际上可能有点危险。如果你想为一个真正不透明的类型定义一个名字,那么使用它的代码并没有利用它是一个结构或指针的事实,typedef
是一个很好的解决方案;否则,你只是在遮掩重要的信息。
我只是写:
struct work {
// contents
};
,然后参考类型struct work
,和一个指针类型struct work*
。
但如果你真的觉得需要有一个字的名称类型,没有必要为标签和类型定义使用不同的名称:
typedef struct work {
// contents
} work;
现在,您可以参考类型如struct work
或work
,指针类型为struct work*
或work*
。 (C++会隐式地执行; C不会)。请注意,如果struct work
包含指向另一个struct work
的指针,则不能在定义内使用typedef名称; typedef名称在定义结束之前不可见。
它没有定义新的类型;它为现有类型定义新名称。 – 2012-01-18 23:16:55
@KeithThompson你说得对。为了避免混淆,我更新了答案。感谢您的反馈意见。 – jcollado 2012-01-18 23:22:51