我有几个与 struct 和 typedef 有关的问题,有一段代码,我标记了一些我不确定语法是否正确的地方。我使用 Eclipse 编辑器,它会在编译出现问题时向我显示。我只是不明白为什么有时需要关键字结构有时不需要。我在使用这个关键字时可能也有一些错误。所以请帮助我理解它。
让我们有结构
typedef struct player
{
char *name;
int gameId;
int points;
int socketfd; //socket descriptor of player
int state;
} player_struct;
让我们有另一个结构
#define PLAYERSLEN 2
typedef struct game{
struct player_struct *players[PLAYERSLEN]; //PLACE1
//some code
} game_struct;
让我们有功能
player_struct *create_player() //PLACE2
{
player_struct *player; //PLACE3
//alokace pameti
player = (player_struct *) malloc(sizeof(player_struct)); //PLACE4
//PLACE5
player->gameId = -1;
player->points = 0;
player->state = 0;
return player;
}
让我们有功能吗?事实上这个定义意味着什么?
void *( player_struct *player) //PLACE6
{
//some code
}
问题引用:
PLACE1 - 这是正确的吗?为什么我不能只使用player_struct *players[PLAYERSLEN]; ??
PLACE2 - 看起来在player_struct之前不需要结构体,这是正确的吗?为什么?
PLACE3 - 看起来也不需要struct,这是正确的吗?为什么?
PLACE4 - 看起来也不需要struct,这是正确的吗?为什么?
PLACE4 和 PLACE5 我可能应该在那里处理错误,因为有 malloc,所以我可能应该将所有带有 PLACE4 的行放在 if 处,如果 malloc 失败我应该放在 PLACE 处5 免费(玩家)。我说得对吗?
PLACE6 这个功能或者它是什么可能意味着什么?此处未包含的括号内的代码应删除播放器..我只是不明白编写函数的语法 - 这是什么意思?
PLACE6 - 再次与之前类似,为什么没有必要在这一行的player_struct之前放置关键字struct?正确吗?
非常感谢您抽出时间。
最佳答案
您在初始定义中做了两件事:
- 您正在使用类型名称
struct player
定义结构。 - 您正在创建一个名为
player_struct
的 typedef,它只是struct player
的别名。
因此,struct player
或 player_struct
都是正确的(并且或多或少等效),但 struct player_struct
引用的是完全独立的类型,并且可能是不正确的,除非您试图混淆人们。
现在,按顺序处理您的六个案例:
- PLACE1:如上所述,这段代码实际上是错误的。
- PLACE2、PLACE3、PLACE4:全部正确;请参阅上面的解释。
- PLACE5:是的,您应该检查一下
player != NULL
来确定。 - PLACE6:同样,这是正确的,原因如上所述。不过,我不确定
void *(...)
应该是什么 - 如果*
实际上是一个函数名称,那么它可能没问题。<
关于c - C 中关键字 struct 的放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9012667/