我已经在头文件中删除了一个结构,现在我想在另一个c文件中定义一个这个结构的数组,以便从我的主c文件中分离出来。 第二个c文件中的组件定义不可能像我尝试的那样(参见下面的代码)。如何在另一个c文件(或h文件中)中定义结构,但我认为h文件中不应该有定义。
的main.c
#include "struct.h"
int main(void)
{
printf("%s",room[0].name);
return 0;
}
struct.h
struct RoomStruct
{
char name[20];
int rRight, rLeft, rFront, rBack, rUp, rDown;
};
typedef struct RoomStruct Room;
extern Room rooms[20];
struct.c
#include <string.h>
#include "struct.h"
Room rooms[20];
strcpy(rooms[0].name,"firstRoom");
rooms[0].rLeft = 1;
答案 0 :(得分:1)
正如@mah建议的那样,我会考虑调用函数来保持数据分离。这具有将“意大利面条代码”保留在代码库之外的附加价值。例如,如果您有一个Room
结构的全局数组,则可以从任何地方调用它。在文件中包含Room
结构的静态数组是一种更好的做法(恕我直言)。这是我编写的一个简单示例:
<强>的main.c 强>
#include "struct.h"
#include <string.h>
#include <stdio.h>
int main (void)
{
Room localRoom[20];
strcpy(localRoom[0].name, "firstRoom");
StructFunc_UpdateStruct(localRoom);
strcpy(localRoom[0].name, "renamed");
StructFunc_Print();
printf("%s", localRoom[0].name);
return 0;
}
<强> struct.h 强>
typedef struct
{
char name[20];
int rRight, rLeft, rFront, rBack, rUp, rDown;
} Room;
void StructFunc_UpdateStruct(Room * roomData);
void StructFunc_Print(void);
<强> StructFunc.c 强>
#include <string.h>
#include <stdio.h>
#include "struct.h"
static Room gRoom[20];
extern void StructFunc_UpdateStruct(Room * roomData)
{
strcpy(gRoom[0].name, roomData[0].name);
}
extern void StructFunc_Print(void)
{
printf("%s\r\n", gRoom[0].name);
}
我希望有所帮助!
根据评论进行编辑
我会假设(根据您的评论)您希望能够使用不同的“房间”重建此程序,具体取决于您使用哪个.c文件进行编译。如果这是你想要达到的目标,那么这对你有用:
main.c
#include "struct.h"
#include <stdio.h>
int main (void)
{
printf("%s", rooms[0].name);
return 0;
}
struct.h
#define NUM_OF_ROOMS 2
#define MAX_STRING_SIZE 20
typedef struct
{
char name[MAX_STRING_SIZE];
int rRight, rLeft, rFront, rBack, rUp, rDown;
} Room;
extern Room rooms[];
<强> struct.c 强>
#include "struct.h"
Room rooms[NUM_OF_ROOMS] =
{
/* Room 0 */
{
/* Name rRight rLeft rFront rBack rUp rDown */
"Living", 1, 2, 3, 4, 5, 6
},
/* Room 1 */
{
"Dining", 2, 3, 4, 5, 6, 0
}
};
SIMPLER BUILD FORMAT
另一种选择是添加#define
,这样您就不必更改正在构建的文件 - 只需更改#define
的值即可:
<强> struct.h 强>
#define MAP_NUMBER 0 //Change this value to use a different map.
#define NUM_OF_ROOMS 2
#define MAX_STRING_SIZE 20
typedef struct
{
char name[MAX_STRING_SIZE];
int rRight, rLeft, rFront, rBack, rUp, rDown;
} Room;
extern Room rooms[];
<强> struct.c 强>
#include "struct.h"
#if (MAP_NUMBER == 0)
Room rooms[NUM_OF_ROOMS] =
{
/* Room 0 */
{
/* Name rRight rLeft rFront rBack rUp rDown */
"Living", 1, 2, 3, 4, 5, 6
},
/* Room 1 */
{
"Dining", 2, 3, 4, 5, 6, 0
}
};
#elif (MAP_NUMBER == 1)
Room rooms[NUM_OF_ROOMS] =
{
/* Room 0 */
{
/* Name rRight rLeft rFront rBack rUp rDown */
"Kitchen", 1, 2, 3, 4, 5, 6
},
/* Room 1 */
{
"Bathroom", 2, 3, 4, 5, 6, 0
}
};
#else
Room rooms[NUM_OF_ROOMS] =
{
/* Room 0 */
{
/* Name rRight rLeft rFront rBack rUp rDown */
"Bedroom", 1, 2, 3, 4, 5, 6
},
/* Room 1 */
{
"Dungeon", 2, 3, 4, 5, 6, 0
}
};
#endif
答案 1 :(得分:0)
正如mah所说,你不能只是将指令放在任何函数范围之外的文件中。您可以声明结构的实例。
至于如何引用另一个文件中声明的变量,可以使用extern关键字。
room.c
#include "room.h"
struct room my_room;
的main.c
#include "room.h"
extern struct room my_room;
extern声明告诉编译器,给定变量的内存是在其他一些待链接文件中定义的。没有理由不在主要中定义你在另一个头文件中定义的结构,但我不会使用这样的外部。