Когда использовать typedef в c?

может ли кто-нибудь сказать мне, когда использовать typedef в C? В следующем коде я получаю предупреждение gcc :

warning: useless storage class specifier in empty declaration

typedef struct node
{
  int data;
  struct node* forwardLink;
} ;

6 ответов


так..

вы можете сделать это:

struct node {
  int data;
  struct node* forwardLink;
};

определить объект, который можно использовать как struct node.

такой:

struct node x;

однако, скажем, вы хотели бы назвать его просто node. Тогда вы могли бы сделать:

struct node {
  int data;
  struct node* forwardLink;
};

typedef struct node node;

или

 typedef struct {
  int data;
  void* forwardLink;
} node;

и потом:

node x;

синтаксис typedef is typedef <type> <name>; он делает тип доступным через name. В этом случае вы указали только type, а не name, Так что ваш компилятор жалуется.

вы, вероятно, хотите

typedef struct node
{
  int data;
  struct node* forwardLink;
} node;

использовать typedef когда вы хотите использовать другое имя для типа, например, структуру.

в вашем случае, вместо того, чтобы использовать struct node чтобы объявить переменную, вы можете вместо этого использовать просто Node, как псевдоним для struct node.

но вам не хватает псевдонима в вашей декларации:

typedef struct node
{
  int data;
  struct node* forwardLink;
} Node;

это выполняет то же самое, но может лучше осветить причину вашей ошибки:

struct node
{
  int data;
  struct node* forwardLink;
};

// this is equivalent to the above typedef:
typedef struct node Node;

typedef struct node
{
    int data;
    struct node* forwardLink;
} MyNode;

В случае, если вы хотите написать

MyNode * p;

вместо

struct node *p;

внутри структуры, вам все еще нужно struct node * forwardLink;


Typedef используется для определения типа данных пользователя. Например

typedef int integer;

теперь вы можете использовать integer для определения типа данных int вместо int.

integer a;// a would be declared as int only

для contants, которые являются списком возможных значений некоторой переменной:

typedef enum {BLACK=0, WHITE, RED, YELLOW, BLUE} TColor;

В общем, это помогает вам знать, правильно ли вы манипулируете вещами, потому что компиляторы предупредят вас о неявных отливках, среди прочего. Это более полезно, чем просто сделать ваш код более читаемым.