在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”
我做错了什么?
答案 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) { ... }
这个可以player
或struct 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
也许您认为player
是struct
的名称,但事实并非如此。类型与之前相同(匿名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;
关键字typedef
将player
转换为类型名称(请记住,在没有typedef
的情况下,它是一个变量)。在上面的声明中没有变量。它声明的是struct _player
类型和player
,它是struct _player
(别名)的不同名称。
上面没有struct player
的定义,因为您发布的代码中没有。编译器找到对struct player
的引用,除了它是struct
的信息之外,它对它没有任何了解。因此,它会显示您提到的错误。