c在另一个c文件中定义struct

时间:2015-03-30 16:29:55

标签: c arrays struct definition extern

我已经在头文件中删除了一个结构,现在我想在另一个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;

2 个答案:

答案 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声明告诉编译器,给定变量的内存是在其他一些待链接文件中定义的。没有理由不在主要中定义你在另一个头文件中定义的结构,但我不会使用这样的外部。