繁体   English   中英

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

[英]What exactly does this syntax do? (in relation to c-style structs)

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

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

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

它定义了两个typedef,如:

typedef struct work_tag {
    //contents.
} work_t;

typedef struct work_tag *work_p;

正如其他答案所说,它定义了两个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名称在定义结束前不可见。

想象一下类似变量声明的typedef 就像你可以在int a, b中创建两个int变量一样,你可以使用typedef int a_t, b_t在一个typedef创建两个类型。

它为现有类型分配了两个备用名称:

work_t -> struct work_tag
work_p -> struct work_tag *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM