typedef结构如何在语法上起作用?

时间:2018-03-28 16:21:32

标签: c typedef

我是新手,所以如果我是密集的话,我道歉。我无法理解如何使用typedef。假设我有以下命令:

typedef struct {
    char pseudo[MAX_SIZE] ;
    int nb_mar ;
    } player ;

这会创建一个名为player的类型,其中包含一串字符和一个int,是否正确?

现在,如果我们有这行代码:

struct set_of_players {
    player T[NB_MAX_JOUEURS] ;
    int nb ;
    }; 

我不明白这是做什么的?我假设它创建了一个struct set_of_players类型的变量,但是它叫什么?通常当我看到这种命令时,在关闭的amplesand表示变量名称后面有一个单词,但是这里没有任何内容;我不明白。如果我没有为typedef struct set_of_players做过typedef struct set_of_players players; ,这会发挥作用吗?

最后,我有这行代码,我不明白:

typedef

老实说,我不知道这甚至意味着什么。我假设这是<a href="{{ route(\Route::current()->getName(), [...]) }}">link</a>我需要使前一个命令有意义,但我甚至不知道它的作用。

再次,如果我以错误的方式看待这个,并且格式不佳,我很抱歉。非常感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分:5)

typedef语句允许您为给定类型创建别名。然后,您可以使用别名或原始类型名称来声明该类型的变量。

typedef int number;

这会为名为int的{​​{1}}创建别名。因此,以下两个语句声明了相同类型的变量:

number

现在使用你的例子:

int num1;
number num2;

这会创建一个匿名结构,并为其指定别名typedef struct { char pseudo[MAX_SIZE] ; int nb_mar ; } player ; 。由于结构没有名称,因此只能使用别名来创建该类型的变量。

player

这会创建一个名为struct set_of_players { player T[NB_MAX_JOUEURS] ; int nb ; }; 的结构体,但不会声明typedef,也不会声明该类型的变量。另请注意,其中一个字段是struct set_of_players类型的数组,我们之前已经定义过它。您可以稍后声明此类型的变量,如下所示:

player

这一行:

struct set_of_players my_set_var;

为名为typedef struct set_of_players players; 的{​​{1}}创建别名。在这种情况下,struct不是与typedef同时定义的,而是在别处定义的。所以现在你可以像这样声明一个这种类型的变量:

struct set_of_players

与使用完整结构名称的版本相同。

答案 1 :(得分:2)

第一种语法

typedef struct {
    char pseudo[MAX_SIZE] ;
    int nb_mar ;
    } player ;

这定义了一个未命名的struct。然后,使用typedef,它会为此struct创建一个别名:player

然后,您可以像这样声明struct

player my_player;

它类似于这种语法:

typedef struct s_player {
  char pseudo[MAX_SIZE];
  int nb_mar;
} player;

在第二种情况下,由于您的struct有一个名称,您可以像这样声明player

player my_player;
struct s_player my_player;

第二种语法

struct set_of_players {
  player T[NB_MAX_JOUEURS];
  int nb;
}; 

这定义了一个结构struct set_of_players由于您没有typedef,因此您需要声明此类型的变量,如下所示:

struct set_of_players my_set;

第三种语法

typedef struct set_of_players players;

这定义了players类型,它是struct set_of_players类型的别名。

因为这会为struct set_of_players创建一个别名,所以它采用第二种语法:

struct set_of_players {
  player T[NB_MAX_JOUEURS];
  int nb;
};

答案 2 :(得分:0)

在您宣布此行代码typedef struct set_of_players players;

后,我正在回答您

所以你的代码会像这样工作: -

假设: -

 #define MAX_SIZE 20
 #define NB_MAX_JOUEURS 2

现在您可以在我们的代码中同时使用类似名称: -

 typedef struct set_of_players players;
 players PLAYERS;
 strcpy(PLAYERS.T[0].pseudo, "something");
 PLAYERS.T[0].nb_mar = 1;

 struct set_of_players {
      player T[NB_MAX_JOUEURS] ;// reffering to the above example you have created a array of struct `player` and its size is 2
   int nb ;
  };

您也可以使用以下结构: -

 struct set_of_players setplayers;
 strcpy(setplayers.T[0].pseudo, "something");
 setplayers.T[0].nb_mar = 1;

当您为其声明类型名称时,您不需要使用struct set_of_players创建变量,而是使用类型名称。这意味着你已经给你的结构一个特定的名字,在你的情况下,它分别是玩家和玩家。

答案 3 :(得分:0)

typedef是一件非常简单的事情。尽管它的名称不是定义新类型,而是为现有类型定义别名(名称)。它的语法在所有情况下都是:

typedef <existing-type> <type-alias>

在C中,结构类型由此定义:

struct <tag> { <member-list> } ;

它的类型struct <tag>,这可能是您想要输入的内容,并且可能会被视为混乱。因此,创建别名是一种常见的习惯用法,因此您不需要在标记之前添加struct。因此:

typedef struct <tag> { <member-list> } <type-alias> ;

typedef struct <tag> <type-alias> ;

两者都为struct <tag>创建别名,但在第一个中,别名和结构都在同一个语句中定义,而在第二个中,使用现有的结构定义。

给定这样的typedef,而不是声明结构变量...

struct <tag> structure_variable ;

......你可以使用:

<type-alias> structure_variable ;

这只是语法糖 - typedef不会影响代码行为或代码生成。

请注意,可以使用匿名结构(没有标记名称)来定义typedef,这样结构只能使用别名实例化:

typedef struct { <member-list> } <type-alias> ;

事实上,如果结构是 self refer ,你只需要一个标签名称 - 即它包含指向其自身类型的结构的指针(例如在链表中),然后:< / p>

typedef struct <tag>
{
    struct <tag>* self ;  // Cannot use <type-alias> here;
                          // it does not exist yet.
    ...
} <type-alias> ;

答案 4 :(得分:0)

typedefstruct是两种不同的声明。 struct定义结构类型。 typedef为现有类型定义别名(它不会创建新类型)。它们可以合并为一个声明。既不会创建指定类型的对象(变量)。

struct player {
    char pseudo[MAX_SIZE];
    int nb_mar;
};

这是一个结构定义。它会创建一个名为struct player的新类型。

typedef struct {
    char pseudo[MAX_SIZE];
    int nb_mar;
} player;

结构定义中的标记是可选的。如果省略它,结构类型是匿名的。在这里,我们将匿名结构定义与typedef相结合,使player成为匿名结构类型的别名。

typedef struct player {
    char pseudo[MAX_SIZE];
    int nb_mar;
} player;

这里我们创建一个名为struct player的结构类型和该类型的别名player。 (结构定义的语法将标记放在struct关键字后面; typedef的语法将名称放在最后。)

我们现在可以将该类型称为struct playerplayer

这是另一种做同样事情的方法:

struct player {
    char pseudo[MAX_SIZE];
    int nb_mar;
};
typedef struct player player;

使用两个单独的声明,我们创建一个名为struct player的新类型,然后我们使用typedef为该类型player定义一个新名称。

在所有这些示例中,我对结构标记和typedef名称使用了相同的标识符。不要求它们相同,并且存在可以使用struct player_stypedef ... player_t的编码约定。但由于两个名称都指的是同一类型,因此没有真正的理由使用不同的名称。他们至少应该以一种简单而明显的方式相互联系。

请注意,结构类型的typedef永远不是必需的。您可以在不使用typedef的情况下定义结构类型,并始终将类型称为struct player。所有typedef都为已经具有完美名称的类型定义了一个新名称。 (优点是新名称是一个单一的标识符;我个人认为这不是一个优势。)

另一点是,如果结构包含指向其自己类型的指针,则需要结构标记:

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

您必须在struct node的声明中使用next,因为typedef名称尚未显示。 (有很多方法可以使用前向声明,但我不会涉及到这一点。)