c - C 中关键字 struct 的放置

标签 c struct typedef

我有几个与 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?正确吗?

非常感谢您抽出时间。

最佳答案

您在初始定义中做了两件事:

  1. 您正在使用类型名称 struct player 定义结构。
  2. 您正在创建一个名为 player_struct 的 typedef,它只是 struct player 的别名。

因此,struct playerplayer_struct 都是正确的(并且或多或少等效),但 struct player_struct 引用的是完全独立的类型,并且可能是不正确的,除非您试图混淆人们。

现在,按顺序处理您的六个案例:

  • PLACE1:如上所述,这段代码实际上是错误的。
  • PLACE2、PLACE3、PLACE4:全部正确;请参阅上面的解释。
  • PLACE5:是的,您应该检查一下 player != NULL 来确定。
  • PLACE6:同样,这是正确的,原因如上所述。不过,我不确定 void *(...) 应该是什么 - 如果 * 实际上是一个函数名称,那么它可能没问题。<

关于c - C 中关键字 struct 的放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9012667/

相关文章:

c - 编译示例 CUDA 程序时出现的问题

c - 从二叉树中获取最大值

go - 如何将 slice 元素传递给函数

arrays - swift : protocol extension and arrays

c++ - typedef 枚举和枚举类有什么区别?

适用于 GCC 和 MS Visual Express C++ 的 C 程序仅适用于 GCC

CMPLX 使用 GCC 产生 undefined symbol

c++ - 将 typedef 移动到函数模板参数时编译错误

xcode - 尝试构建用于发布的 XCode 项目时出现 Typedef 重定义错误

c - 填充 malloc() 分配的内存的效果