Struct函数返回不完整类型

时间:2017-10-21 04:25:41

标签: c struct

在header.h中我有:

typedef struct {
    int score;
    int dice[6];
    int scorecard[2][7];
} player;

然后在definitions.c中我有:

struct player do_turn(struct player user) {
    for (int i = 0; i < 6; i++) {
        int die = roll_die();
        user.dice[i] = die;
    }
    return (user);
}

在函数定义中,我得到错误“function do_turn返回不完整类型struct player”

我做错了什么?

2 个答案:

答案 0 :(得分:7)

此结构可以(仅)作为struct player访问:

struct player {
    int score;
    int dice[6];
    int scorecard[2][7];
};

struct player do_turn(struct player user) { ... }

此结构可以(仅)仅作为player访问:

typedef struct {
    int score;
    int dice[6];
    int scorecard[2][7];
} player;

player do_turn(player user) { ... }

这个可以playerstruct player

进行访问
typedef struct player {
    int score;
    int dice[6];
    int scorecard[2][7];
} player;

struct player do_turn(player user) { /* don't actually mix them like this :-P */ }

根据您的观看方式,更改您的结构定义,功能定义或两者,以使它们匹配。

答案 1 :(得分:2)

让我们解构player

的定义

这是类型:

struct {
    int score;
    int dice[6];
    int scorecard[2][7];
}

这是一个匿名的struct。虽然它是正确的,但匿名struct并不是非常有用,因为定义无法重复使用,必须在需要时再次输入。

让我们添加名称:

struct {
    int score;
    int dice[6];
    int scorecard[2][7];
} player

也许您认为playerstruct的名称,但事实并非如此。类型与之前相同(匿名struct),player是此类型的变量。

如何命名struct

为上述匿名struct添加名称很简单:将名称紧跟在struct关键字之后(在开放大括号之前):

struct _player {
    int score;
    int dice[6];
    int scorecard[2][7];
} player;

player仍然是一个变量,但现在它的类型不再是匿名的了。它的类型是struct _player(不只是_player)。关键字struct是名称的一部分。

当我们将typedef放在前面时会发生什么?

typedef struct _player {
    int score;
    int dice[6];
    int scorecard[2][7];
} player;

关键字typedefplayer转换为类型名称(请记住,在没有typedef的情况下,它是一个变量)。在上面的声明中没有变量。它声明的是struct _player类型和player,它是struct _player(别名)的不同名称。

上面没有struct player的定义,因为您发布的代码中没有。编译器找到对struct player的引用,除了它是struct的信息之外,它对它没有任何了解。因此,它会显示您提到的错误。