我几乎没有与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 *玩家[PLAYERSLEN]; ??
PLACE2 - 看起来在player_struct之前没有需要的struct,它是否正确?为什么呢?
PLACE3 - 看起来还有 struct 也不需要,是否正确?为什么呢?
PLACE4 - 看起来还有 struct 也不需要,是否正确?为什么呢?
PLACE4& PLACE5 我可能应该处理错误,因为有malloc所以我应该把PLACE4的所有行放到if如果malloc失败我应该放在PLACE 5 免费(播放器)即可。我是对的吗?
PLACE6 什么可能意味着这个功能或它是什么?这里没有包含的括号内的代码应该删除播放器..我只是不明白写函数的语法 - 是什么意思?
PLACE6 - 再次类似于之前为什么没有必要在此行之前将关键字 struct 放在player_struct之前?这是正确的吗?
非常感谢你的时间。
答案 0 :(得分:2)
你在初始定义中做了两件事:
struct player
定义结构。player_struct
的typedef,它只是struct player
的别名。因此,struct player
或player_struct
都是正确的(并且或多或少相当),但struct player_struct
指的是一个完全独立的类型,除非你',否则可能是错误的试图混淆人们。
现在,按顺序处理你的六个案件:
player != NULL
以确定。void *(...)
应该是什么,如果*
实际上是一个函数名,那么它可能很好。答案 1 :(得分:1)
这是因为标签位于两个独立的命名空间中(是的,即使在C中)。结构域有一个特殊的命名空间。
我喜欢在两个名称空间中声明标签,使用:
typedef struct mon_struct {
int a;
} mon_struct;
然后您可以使用/ struct mon_struct mon = ...
或mon_struct mon = ...
。
<强>更新强>
如果您只想使用一个标签,则可以使用以下方法之一:
struct mon_struct { int a; };
// requires namespace resolution using struct tag:
void f(struct mon_struct p);
// -= OR =-
// slightly awkward declaration
typedef struct { int a; } mon_struct;
// but the type exists in the global namespace,
// so we don't need to use the struct tag:
void f(mon_struct p);
但如果您在C和C ++中使用结构,这会变得混乱,特别是当声明或实现在没有适当保护(extern "C" { ...stuff... }
)的C和C ++之间移动时。
因此您可以选择在两个名称空间中声明它以最大限度地减少破损:
typedef struct mon_struct { int a; } mon_struct;
void f(struct mon_struct p); // << ok
void f2(mon_struct p); // << ok
答案 2 :(得分:0)
你不需要在PLACE1中使用struct ...只要已知player_struct的定义,即在它之前声明,或者在它之前的.h。
答案 3 :(得分:0)
player_struct
是struct player
的typedef。在这种情况下,您不需要struct
关键字。player_struct
的类型定义,表示struct player
。malloc()
是否返回NULL。此外,不要从malloc()
转换返回值。这样做可以隐藏#include
错误。struct
- 与上述相同,您不需要typedef
。如果您完全删除代码中的typedef
,player_struct
和game_struct
,则可能会发现这一切更有意义。然后,一旦你习惯了这一切是如何工作的,你可以重新引入typedefs
并可能减少一些打字。作为一个简单的例子,您可以将第一个定义分解为其组件:
struct player
{
char *name;
int gameId;
int points;
int socketfd; //socket descriptor of player
int state;
};
typedef struct player player_struct;
也许这会帮助你理解它?