首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确使用C中结构的“类型防御”?

如何正确使用C中结构的“类型防御”?
EN

Stack Overflow用户
提问于 2022-02-25 19:39:20
回答 2查看 3K关注 0票数 4

在许多typedef课程和示例中,我看到了许多不同的C用法。

下面是正确的方法(例如来自ISO/IEC C语言规范草案)

代码语言:javascript
运行
复制
typedef struct tnode TNODE;

struct tnode {
    int count;
    TNODE *left, *right;
};

TNODE s, *sp;

但是,我看到了很多代码,其模式如下:

代码语言:javascript
运行
复制
typedef struct {
    int a;
    int b;
} ab_t;

这个错误是出于某些原因,还是正确的,但它提供了这样定义的结构的有限功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-25 19:44:51

这样做的目的是:

代码语言:javascript
运行
复制
typedef struct {
    int a;
    int b;
} ab_t;

是定义一个匿名struct并给它别名ab_t。对于这种情况,没有问题,因为您可以始终使用别名。但是,如果其中一个成员是指向此类型的指针,则会出现问题。

例如,如果您尝试这样做:

代码语言:javascript
运行
复制
typedef struct {
    int count;
    TNODE *left, *right;
} TNODE;

这不起作用,因为TNODE类型在使用时还没有定义,而且您不能使用结构的标记(即struct关键字后面的名称),因为它没有一个。

票数 6
EN

Stack Overflow用户

发布于 2022-02-25 20:36:31

这两种类型胡枝子之间的区别

代码语言:javascript
运行
复制
typedef struct tnode TNODE;

struct tnode {
    int count;
    TNODE *left, *right;
};

TNODE s, *sp;

代码语言:javascript
运行
复制
typedef struct {
    int a;
    int b;
} ab_t;

。在第二种情况下,您声明了一个未命名的结构。这意味着在结构中,你不能引用它本身。例如,您不能编写fir示例。

代码语言:javascript
运行
复制
typede struct {
    int count;
    TNODE *left, *right;
} TNODE;

因为在此成员声明中使用的名称TNODE

代码语言:javascript
运行
复制
    TNODE *left, *right;

还没有宣布。

但是,如果结构标签有如下所示的名称,则可以引用结构

代码语言:javascript
运行
复制
struct tnode {
    int count;
    struct tnode *left, *right;
};

因为名称struct tnode已经声明了。

另一个不同之处是,要声明指向结构的指针,不需要对结构有完整的定义。那就是你可以写

代码语言:javascript
运行
复制
typedef struct tnode TNODE;

TNODE *sp;

struct tnode {
    int count;
    TNODE *left, *right;
};

请注意,您还可以用以下方式编写ty胡枝子声明

代码语言:javascript
运行
复制
struct tnode {
    int count;
    struct tnode *left, *right;
} typedef TNODE;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71270954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档