首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构中的DIfference?

结构中的DIfference?
EN

Stack Overflow用户
提问于 2013-12-16 16:50:26
回答 3查看 471关注 0票数 13

在以下方面有什么区别:

代码语言:javascript
复制
typedef struct part 
{
   int a;
} Part;

代码语言:javascript
复制
typedef struct 
{
   int a;
} Part;

我知道第二个是“匿名”,但它们不同吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-16 16:58:00

除了Mike Seymour的回答外,还有一个例子说明了为什么:

例如,链接列表

代码语言:javascript
复制
// this works
typedef struct part {
    struct part *next;
} Part;

// this doesn't work
typedef struct {
    struct Part *next;
} Part;
// neither this
typedef struct {
    Part *next;
} Part;
票数 18
EN

Stack Overflow用户

发布于 2013-12-16 16:53:07

在这两种情况下,您都定义了一个结构类型,以及一个名为Part的类型别名,它引用了该类型。

在第一种情况下,您还定义了一个结构名part,因此结构类型也可以称为struct part,或者仅在C++中称为part

在第二种情况下,结构本身没有名称(因此是“匿名”),只能由类型别名引用。由于该别名仅在结构定义之后声明,因此该结构不能引用自身。

票数 15
EN

Stack Overflow用户

发布于 2013-12-16 17:38:54

除了@EoiFirst的答案,

代码语言:javascript
复制
typedef struct part 
{
   int a;
   struct part *next;
} Part;

这是有效的,因为next是指向struct part指针,因此它具有指针类型的大小。

C是一种类型化语言,所以编译器知道next的类型,在完全定义struct part之后,它将能够确定下面的代码是有效的。它知道next是指向struct part的指针,它有一个字段int a

代码语言:javascript
复制
void test(struct part *p) {
    if (p != NULL && p->next != NULL) {
        printf("%d\n", p->next->a); // this is valid
    }
}

你可以宣布

代码语言:javascript
复制
typedef struct part 
{
   int a;
   void *next;
} Part;

struct part的大小仍将与上面声明的大小相同。现在,next是指向任何东西的指针,上面使用test()的代码会编译错误。

代码语言:javascript
复制
warning: dereferencing 'void *' pointer
error: request for member 'a' in something not a structure or union

您需要编写printf("%d\n", ((struct part *) p->next)->a);

而且,你也不能声明这个,

代码语言:javascript
复制
typedef struct part 
{
   int a;
   struct part nested;
} Part;

您将得到一个编译器错误。

代码语言:javascript
复制
error: field 'nested' has incomplete type
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20616206

复制
相关文章

相似问题

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