struct和typedef

时间:2010-09-22 19:38:31

标签: c struct typedef

以下是C语言中的等效内容吗?

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

typedef struct myStruct Foo;

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

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

(是的,我看过thisthis。)

3 个答案:

答案 0 :(得分:12)

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

// 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;

答案 1 :(得分:9)

不,他们并不完全等同。

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

在第二个版本中,Foo对于未命名的typedefstruct

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

答案 2 :(得分:3)

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

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;
};