如何在定义上初始化结构? [复制]

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;

【讨论】:

以上是关于如何在定义上初始化结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何实现结构体的深度复制

如何将结构数组里的两个成员位置交换

如何封装C语言的字符串相关功能

如何在 Swift 的自定义类中初始化 Timer? [复制]

如何在结构定义中初始化数组?

如何在 C++ 中为用户定义的结构初始化最小值?