在C中的单独文件中包含变量?

时间:2017-02-08 05:20:35

标签: c

我创建了一个结构项:

typedef struct item
{
    char name[20];
    char desc[100];
    int lp;
    int shield;
    int weapon;
} item;

我需要36个,所以我创建了一个数组item treasure[6][6];

对于每个项目,我按如下方式插入数据:

    strcpy(treasure[0][0].name, "name");
    strcpy(treasure[0][0].desc, "none");
    treasure[0][0].lp = 0;
    treasure[0][0].shield = 0;
    treasure[0][0].weapon = 200;

我这样做36次并在编辑器中占用了大量空间,我的问题是:我可以将它放在单独的.c / .h文件中吗?我一直在尝试,但无法使其发挥作用。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我建议使用带有以下内容的文件,例如 init.h

#include <string.h>
typedef struct item {
  char name[20];
  char desc[100];
  int lp;
  int shield;
  int weapon;
} item;

item treasure[1][1] = {
    {{.name = "name", .desc = "none", .lp = 0, .shield = 0, .weapon = 200}}};

以这种方式,您必须能够在另一个文件中初始化矩阵6,6的结构,然后您必须能够从程序中访问它,如下所示:

#include "init.h"
#include <stdio.h>

int main() {
  printf("%s\n", treasure[0][0].name);
  return 0;
}

我希望这对你有用,还有另一种初始化结构的方法,但这个是我经常使用的。您可以在这里找到更多信息 https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

答案 1 :(得分:0)

如果您想从一开始就学习如何进行正确的C程序设计,那么就是这样。

执行此操作的正确方法是创建item.h和item.c文件。他们一起组成了一个“代码模块”(或类,如果你愿意的话)。

您的头文件item.h应包含typedef和header guard。你也应该写一个初始化函数。

// item.h
#ifndef ITEM_H
#define ITEM_H

#include <string.h>

typedef struct {
  char name[20];
  char desc[100];
  int lp;
  int shield;
  int weapon;
} item_t;

void item_init (item_t*    item,
                const char name[20],
                const char desc[100],
                int        lp,
                int        shield,
                int        weapon);

#endif

然后,您可以在init.c中实现init函数:

// item.c
#include "item.h"

void item_init (item_t*    item,
                const char name[20],
                const char desc[100],
                int        lp,
                int        shield,
                int        weapon)
{
  strcpy(item->name, name);
  strcpy(item->desc, desc);
  item->lp = lp;
  item->shield = shield;
  item->weapon = weapon;
}

这两个文件init.h和init.c只关注所有item_t变量的行为。您可以随时使用更多功能扩展它们。它们不会也不应包含任何实际数据。

现在,如果您想将数据分开,可以像这样为它创建一对单独的文件:

// item_data.h
#include "item.h"

#define ITEMS_N 36

item_t* item_data_get (int item_n);

这只是一个“getter”功能,可让您访问数据。实际数据是封装在.c文件中:

// item_data.c
#include "item_data.h"

static item_t items [ITEM_N] = 
{
  [0] = {.name="name", .desc="none", .lp=0, .shield=0, .weapon=200},
  [1] = ... // fill up data here
};

item_t* item_data_get (int item_n)
{
  return items[n];
}

如果您以后想要更改给定项目的数据,可以通过调用item_init(item_data_get(n), ...);

来更改