【问题标题】: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 。有没有办法归档这种行为?

【问题讨论】:

    标签: c struct initialization-list


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2021-12-23
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 2013-11-18
      相关资源
      最近更新 更多