如何在定义上初始化结构? [复制]
Posted
技术标签:
【中文标题】如何在定义上初始化结构? [复制]【英文标题】:How to initialize a structure on definition? [duplicate] 【发布时间】:2013-10-25 00:39:54 【问题描述】:有没有办法用默认初始化值声明结构?
我有一个头文件,它定义了这样的结构:
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
类型的变量。但我没记错。我必须在 c 文件中将其标记为 extern
我想做的是在包含此标头的每个位置我都希望能够执行var = struc_s.dmg
,结果应该是 var 保存值100
。
但是我不想在标题中的其他任何地方声明 struc_s 。有没有办法归档这种行为?
【问题讨论】:
【参考方案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
用于您的结构成员是否有原因?它本身并没有什么问题,但它可能会因平台而异。
【讨论】:
将是默认结构,可以在任何地方访问,它包含在没有像extern const struc_t DEFAULT_STRUC
这样的东西的情况下?这对我来说很好,我只想要一个包含这些值的结构,而不需要显式声明+初始化它。
我喜欢使用 size_t 只是因为据我所知它是 cpu orating 宽度的大小。所以......我只是喜欢 size_t 我没有一个很好的理由。
用#ifndef
更新了答案,这将确保这符合您的要求。也就是说,将DEFAULT_STRUC
放在.c 文件中并在标题中执行extern const struc_t DEFAULT_STRUC
并没有错。
啊,我想你误解了我的意思,但无论如何,你的答案正是我想要的,谢谢。
很高兴为您服务,那么:)【参考方案2】:
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;
【讨论】:
以上是关于如何在定义上初始化结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章