struct и typedef - PullRequest
       3

struct и typedef

9 голосов
/ 22 сентября 2010

следующий эквивалент в C?

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

typedef struct myStruct Foo;

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

Если нет, то какой я должен использовать и когда?

(Да, я видел это и это .)

Ответы [ 3 ]

12 голосов
/ 22 сентября 2010

Второй вариант не может ссылаться на себя.Например:

// 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;
9 голосов
/ 22 сентября 2010

Нет, они не совсем эквивалентны.

В первой версии Foo - это typedef для именованного struct myStruct.

Во второй версии Foo - этоtypedef для неназванного struct.

Хотя оба Foo могут использоваться одинаково во многих случаях, существуют важные различия.В частности, вторая версия не позволяет использовать предварительную декларацию для объявления Foo, а struct для typedef, тогда как первая будет.

3 голосов
/ 23 сентября 2010

Первая форма позволяет вам обращаться к структуре до завершения определения типа, поэтому вы можете ссылаться на структуру внутри себя или иметь взаимозависимые типы:

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