【问题标题】:c define struct in another c filec 在另一个c文件中定义结构
【发布时间】:2015-06-03 18:40:08
【问题描述】:

我已经在我的头文件中删除了一个结构,现在我想在另一个 c 文件中定义这个结构的数组,以将它与我的主 c 文件分开。 组件的定义在我尝试的第二个 c 文件中是不可能的(见下面的代码)。如何在另一个 c 文件(或 h 文件,但我认为 h 文件中不应该有定义)中定义结构。

main.c

#include "struct.h"
int main(void)
{
    printf("%s",room[0].name);
    return 0;
}

结构.h

struct RoomStruct
{
    char name[20];
    int rRight, rLeft, rFront, rBack, rUp, rDown;
};
typedef struct RoomStruct Room;

extern Room rooms[20];

结构体.c

#include <string.h>

#include "struct.h"

Room rooms[20];

strcpy(rooms[0].name,"firstRoom");
rooms[0].rLeft = 1;

【问题讨论】:

  • 如果您粘贴的struct.c 是字面意思...您不能简单地将随机指令放置在您喜欢的任何地方;他们需要在一个函数内。一种选择(可能并不理想)是完全消除指令,而是使用完整的静态初始化来初始化rooms。可能更好的是创建一个函数,您的客户端代码必须调用它来初始化它,或者如果您的编译器支持通用构造函数的非标准概念,则使用它进行自动初始化。
  • “无法定义组件”是什么意思?你得到一个编译器错误吗?如果有,是什么?
  • 顺便说一句,您声明rooms[20],但您尝试从room 打印。这不是这段代码的唯一问题,但值得注意。

标签: c arrays struct definition extern


【解决方案1】:

正如@mah 建议的那样,我会考虑调用函数来保持数据分离。这具有将“意大利面条代码”排除在代码库之外的附加价值。例如,如果您有一个 Room 结构的全局数组,则可以从任何地方调用它。在文件中包含 Room 结构的静态数组是一种更好的做法(恕我直言)。这是我制定的一个简单示例:

ma​​in.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 文件。如果这是您想要实现的目标,那么这应该适合您:

ma​​in.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 文件,可以很容易地被另一个替换,所以我不必更改主文件来加载数组的另一个定义“房间”在我的程序中
  • @winegum,澄清一下...您是否尝试将 Room 数组初始化为不同的值,具体取决于您构建的 .c 文件的版本?
  • 谢谢!这正是我要找的东西,对不起,我的英语水平不好..很难澄清我的问题..没有想到这种可能性
  • @winegum,没问题。我很高兴能帮上忙!
【解决方案2】:

正如 mah 所说,您不能只将指令放在任何函数范围之外的文件中。不过,您可以声明该结构的实例。

至于如何引用另一个文件中声明的变量,可以使用 extern 关键字。

房间.c

#include "room.h"
struct room my_room;

main.c

#include "room.h"
extern struct room my_room;

extern 声明告诉编译器给定变量的内存是在其他要链接的文件中定义的。没有理由不在 main 中定义您在另一个头文件中定义的结构,但我不会使用这样的 extern。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多