正如@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
}
};
更简单的构建格式
另一种选择是添加 #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