c 在另一个c文件中定义结构
c define struct in another c file
我在我的头文件中定义了一个结构,现在我想在另一个 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;
正如 mah 所说,您不能只将指令放在任何函数范围之外的文件中。不过,您可以声明该结构的一个实例。
至于如何引用在另一个文件中声明的变量,您将使用 extern 关键字。
room.c
#include "room.h"
struct room my_room;
main.c
#include "room.h"
extern struct room my_room;
extern 声明告诉编译器给定变量的内存是在其他某个要链接的文件中定义的。没有理由不在 main 中定义一个你在另一个头文件中定义的结构,但我不会像这样使用 externs。
正如@mah 所建议的,我会考虑调用函数来使您的数据分开。这具有将 "spaghetti code" 排除在代码库之外的附加值。例如,如果你有一个 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);
}
希望对您有所帮助!
根据评论编辑
我假设(根据您的评论)您希望能够使用不同的 "rooms" 重建此程序,具体取决于您使用哪个 .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
我在我的头文件中定义了一个结构,现在我想在另一个 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;
正如 mah 所说,您不能只将指令放在任何函数范围之外的文件中。不过,您可以声明该结构的一个实例。
至于如何引用在另一个文件中声明的变量,您将使用 extern 关键字。
room.c
#include "room.h"
struct room my_room;
main.c
#include "room.h"
extern struct room my_room;
extern 声明告诉编译器给定变量的内存是在其他某个要链接的文件中定义的。没有理由不在 main 中定义一个你在另一个头文件中定义的结构,但我不会像这样使用 externs。
正如@mah 所建议的,我会考虑调用函数来使您的数据分开。这具有将 "spaghetti code" 排除在代码库之外的附加值。例如,如果你有一个 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);
}
希望对您有所帮助!
根据评论编辑
我假设(根据您的评论)您希望能够使用不同的 "rooms" 重建此程序,具体取决于您使用哪个 .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