这个语法究竟做了什么? (关于C风格的结构)

这个语法究竟做了什么? (关于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 * 
+0

它没有定义新的类型;它为现有类型定义新名称。 – 2012-01-18 23:16:55

+0

@KeithThompson你说得对。为了避免混淆,我更新了答案。感谢您的反馈意见。 – jcollado 2012-01-18 23:22:51

一个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_tagwork_t不是两个相似的类型,它们是的两个名字,正好是的同一类型。

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

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

我只是写:

struct work { 
    // contents 
}; 

,然后参考类型struct work,和一个指针类型struct work*

但如果你真的觉得需要有一个字的名称类型,没有必要为标签和类型定义使用不同的名称:

typedef struct work { 
    // contents 
} work; 

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