在C中放置关键字struct

时间:2012-01-26 00:54:46

标签: 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 *玩家[PLAYERSLEN]; ??
PLACE2 - 看起来在player_struct之前没有需要的struct,它是否正确?为什么呢?
PLACE3 - 看起来还有 struct 也不需要,是否正确?为什么呢?
PLACE4 - 看起来还有 struct 也不需要,是否正确?为什么呢?
PLACE4& PLACE5 我可能应该处理错误,因为有malloc所以我应该把PLACE4的所有行放到if如果malloc失败我应该放在PLACE 5 免费(播放器)即可。我是对的吗? PLACE6 什么可能意味着这个功能或它是什么?这里没有包含的括号内的代码应该删除播放器..我只是不明白写函数的语法 - 是什么意思?
PLACE6 - 再次类似于之前为什么没有必要在此行之前将关键字 struct 放在player_struct之前?这是正确的吗?

非常感谢你的时间。

4 个答案:

答案 0 :(得分:2)

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

  1. 您正在使用类型名称struct player定义结构。
  2. 您正在创建名为player_struct的typedef,它只是struct player的别名。
  3. 因此,struct playerplayer_struct都是正确的(并且或多或少相当),但struct player_struct指的是一个完全独立的类型,除非你',否则可能是错误的试图混淆人们。

    现在,按顺序处理你的六个案件:

    • PLACE1:如上所述,此代码实际上是错误的。
    • PLACE2,PLACE3,PLACE4:一切正确;见上文有解释。
    • PLACE5:是的,你应该在这里查看player != NULL以确定。
    • PLACE6:同样,这是正确的,其原因在于。我不确定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)

  1. 否。 player_structstruct player的typedef。在这种情况下,您不需要struct关键字。
  2. 正确。您创建了一个名为player_struct的类型定义,表示struct player
  3. 与2相同的原因。
  4. 与2&amp; 3。
  5. 是的,您应该检查malloc()是否返回NULL。此外,不要从malloc()转换返回值。这样做可以隐藏#include错误。
  6. 这不是一个有效的函数定义。由于struct - 与上述相同,您不需要typedef
  7. 如果您完全删除代码中的typedefplayer_structgame_struct,则可能会发现这一切更有意义。然后,一旦你习惯了这一切是如何工作的,你可以重新引入typedefs并可能减少一些打字。作为一个简单的例子,您可以将第一个定义分解为其组件:

    struct player
    {
      char *name; 
      int  gameId; 
      int  points; 
      int socketfd; //socket descriptor of player
      int state;
    };
    
    typedef struct player player_struct;
    

    也许这会帮助你理解它?