c - 我在不同文件中使用结构时遇到问题
问题描述
我在 file.c 中定义了一个结构,并在他的头文件中为他的指针定义了一个 typedef。我想在另一个 file.c 中使用这个 typedef,但它不起作用。我认为这是包含文件的问题。
在文件game.c中
#include <stdbool.h>
#include <stdlib.h>
#include "chessSystem.h"
#include "tournament.h"
#include "game.h"
#include "map.h"
#include "player.h"
struct Game_node
{
int game_id;
Game_data game_data;
Game next;
};
在文件 game.h 我正在做:
typedef struct Game_Node *Game;
我想在另一个文件中使用这个结构:tournament.c 在一个函数中,我尝试定义一个 Game 类型的变量。但我无法访问结构的字段。
#include "game.h"
..........
Game temp_game=malloc(sizeof(*temp_game));
temp_game->
重要的是,在分配 temp_game 时,IDE 会发出错误信号:“sizeof”对不完整类型“struct Game_node”的无效应用。
我知道这不是很清楚。如果你有问题告诉我。
非常感谢。
解决方案
类型定义typedef struct Game_Node *Game;
是指不完整的类型,因为结构的细节Game_Node
是未知的。编译器仍然可以编译仅使用指针的struct Game_Node
代码,但不能编译使用sizeof(struct Game_Node)
或访问此结构成员的代码。
常见的情况FILE
通常被定义<stdio.h>
为不完整的类型。各种流函数采用 aFILE *
并且用户代码不需要知道实现的细节,这在系统之间有很大的不同。
您应该将结构定义从game.c移动到game.h。
如果你想限制对结构内部的访问,你可以在一个单独的文件gamedef.h中定义它,只包含在适当的模块中。
推荐阅读
- c - 当我尝试使用 struct 运行程序时出现分段错误(核心转储)
- c# - C# Compile OutOfMemory 错误,而我正在尝试动态生成要编译的文件操作代码
- clojure - Clojure - 使用 Cloud Firestore 获取实时更新
- python - 在字符串列表中搜索的高效且最快的方法
- c# - 将多个流序列化为一个流
- graphql - Apollo GraphQL 中的模式拼接不解析来自其他部分的类型
- purescript - Purescript:无法匹配类型
- azure - 在响应 500 HTTP 错误时删除服务器标头
- php - Laravel 5.4 作曲家更新错误
- php - 缺少时将 http:// 前缀添加到 URL