如何在定义上初始化结构?

时间:2013-10-16 18:40:28

标签: c struct initialization-list

有没有办法用默认的初始化值声明一个结构?

我有一个头文件,它定义了这样的结构:

typedef struct struc_s
{
    size_t cost const = 2000;
    size_t dmg const = 100;
    size_t def const = 100;
    size_t hull const = 1500;
    size_t shield const = 300;
    size_t capacity const = 2;
    size_t destruc const = 10;
} struc_t;

但这种做法不起作用。

我也可以在这个头文件中声明一个类型为struc_t的var。但我记得没错。我必须在c文件中将其转换为extern

我想要做的是每个包含此标头的位置我希望能够var = struc_s.dmg,结果应该是var保存值100。 但我不想在标题中的其他地方声明struc_s。有没有办法存档这种行为?

2 个答案:

答案 0 :(得分:1)

typedef struct struc_s
{
int a;
int b;    
}s; 

这是类型定义而不是对象的声明。您可以在声明对象时初始化。

当给出连续成员时,使用C89样式的初始化器。

s obj={1,2}; 

对于非连续或无序成员列表,可以使用指定的初始化方式

s obj={.a=1,.b=2};  

     or

s obj={.b=2,.a=1};

第三种方法是复制相同类型的现有对象的值

s obj1=obj;

答案 1 :(得分:1)

不是你想要的方式。

当你做一个typedef时,你要定义一个内存区域的形状,这个过程不同于分配和填充它。

可能的替代方案:

typedef struct 
{
    size_t cost;
    size_t dmg;
    size_t def;
    size_t hull;
    size_t shield;
    size_t capacity;
    size_t destruc;
} struc_t;


#ifndef DEFAULT_STRUC_VALUES_DEFINED
#define DEFAULT_STRUC_VALUES_DEFINED 

const struc_t DEFAULT_STRUC = {
    .cost = 2000,
    .dmg = 100,
    .def = 100,
    .hull = 1500,
    .shield = 300,
    .capacity = 2,
    .destruc = 10
};
#endif

然后当你想要创建一个新的时候:

struc_t *new_struc = malloc(sizeof(struc_t));
memcpy(new_struc, DEFAULT_STRUC, sizeof(struc_t));

作为旁注,您是否有理由对结构成员使用size_t?它没有任何内在错误,但它可能会因平台而异。