我是新手,所以如果我是密集的话,我道歉。我无法理解如何使用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>
我需要使前一个命令有意义,但我甚至不知道它的作用。
再次,如果我以错误的方式看待这个,并且格式不佳,我很抱歉。非常感谢任何帮助,谢谢。
答案 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)
typedef
和struct
是两种不同的声明。 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 player
或player
这是另一种做同样事情的方法:
struct player {
char pseudo[MAX_SIZE];
int nb_mar;
};
typedef struct player player;
使用两个单独的声明,我们创建一个名为struct player
的新类型,然后我们使用typedef为该类型player
定义一个新名称。
在所有这些示例中,我对结构标记和typedef名称使用了相同的标识符。不要求它们相同,并且存在可以使用struct player_s
或typedef ... player_t
的编码约定。但由于两个名称都指的是同一类型,因此没有真正的理由使用不同的名称。他们至少应该以一种简单而明显的方式相互联系。
请注意,结构类型的typedef永远不是必需的。您可以在不使用typedef的情况下定义结构类型,并始终将类型称为struct player
。所有typedef都为已经具有完美名称的类型定义了一个新名称。 (优点是新名称是一个单一的标识符;我个人认为这不是一个优势。)
另一点是,如果结构包含指向其自己类型的指针,则需要结构标记:
typedef struct node {
int data;
struct node *next;
} node;
您必须在struct node
的声明中使用next
,因为typedef名称尚未显示。 (有很多方法可以使用前向声明,但我不会涉及到这一点。)