正如 @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);
}
I hope that helps!
编辑后的内容:
根据您的评论进行了编辑。
我猜测(基于您的评论)您想要能够根据不同的“.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] =
{
{
"Living", 1, 2, 3, 4, 5, 6
},
{
"Dining", 2, 3, 4, 5, 6, 0
}
};
更简单的构建格式
另一种选择是添加一个#define
,这样你就不必改变正在构建的文件 - 只需更改#define
的值,如下所示:
struct.h
#define MAP_NUMBER 0
#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] =
{
{
"Living", 1, 2, 3, 4, 5, 6
},
{
"Dining", 2, 3, 4, 5, 6, 0
}
};
#elif (MAP_NUMBER == 1)
Room rooms[NUM_OF_ROOMS] =
{
{
"Kitchen", 1, 2, 3, 4, 5, 6
},
{
"Bathroom", 2, 3, 4, 5, 6, 0
}
};
#else
Room rooms[NUM_OF_ROOMS] =
{
{
"Bedroom", 1, 2, 3, 4, 5, 6
},
{
"Dungeon", 2, 3, 4, 5, 6, 0
}
};
#endif
struct.c
的代码... 你不能随意放置任何指令; 它们必须在函数内部。一个选项(也许不是理想的)是完全消除这些指令,而是使用完整的静态初始化来初始化rooms
。但更好的方法是创建一个函数,要么是客户端代码必须调用以进行初始化,要么如果您的编译器支持非标准概念的通用构造函数,则利用它进行自动初始化。 - mahrooms[20]
,但你尝试从room
打印。这不是这段代码唯一的问题,但值得注意。 - embedded_guy