繁体   English   中英

struct和typedef

[英]struct and typedef

以下是C中的等价物吗?

// #1
struct myStruct {
    int id;
    char value;
};

typedef struct myStruct Foo;

// #2
typedef struct {
    int id;
    char value;
} Foo;

如果没有,我应该使用哪一个以及何时使用?

(是的,我看过这个这个 。)

第二个选项无法引用自身。 例如:

// Works:
struct LinkedListNode_ {
    void *value;
    struct LinkedListNode_ *next;
};

// Does not work:
typedef struct {
    void *value;
    LinkedListNode *next;
} LinkedListNode;

// Also Works:
typedef struct LinkedListNode_ {
    void *value;
    struct LinkedListNode_ *next;
} LinkedListNode;

不,他们并不完全等同。

在第一个版本中, Foo是命名struct myStruct的typedef。

在第二个版本中, Foo是未命名structtypedef

尽管在许多情况下Foo都可以以相同的方式使用,但是存在重要的差异。 特别是,第二个版本不允许使用前向声明来声明Foo ,而struct它是一个typedef ,而第一个版本则是。

第一种形式允许您在类型定义完成之前引用结构,因此您可以在其自身内引用结构或具有相互依赖的类型:

struct node {
  int value;  
  struct node *left;
  struct node *right;
};

typedef struct node Tree;

要么

struct A;
struct B;

struct A {
  struct B *b;
};

struct B {
  struct A *a;
};

typedef struct A AType;
typedef struct B Btype;

您可以将两者结合起来:

typedef struct node {
  int value;
  struct node *left;
  struct node *right;
} Tree;

typedef struct A AType;  // You can create a typedef 
typedef struct B BType;  // for an incomplete type

struct A {
  BType *b;
};

struct B {
  AType *a;
};

暂无
暂无

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

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