代码之家  ›  专栏  ›  技术社区  ›  sud03r

C结构初始化:奇怪的方式

  •  2
  • sud03r  · 技术社区  · 15 年前

    在阅读我遇到的代码时,结构的以下定义和初始化:

    // header file
    struct foo{
    char* name;
    int value;
    };
    
    //Implementation file
    struct foo fooElmnt __foo;
    // some code using fooElmnt
    struct foo fooElmnt __foo = {
        .name = "NAME";
        .value = some_value;
    }
    

    这在c中是什么意思?它与通常的声明有何不同?

    3 回复  |  直到 9 年前
        1
  •  6
  •   Jacob    15 年前

    这叫 designated initialization ,

    在结构初始值设定项中,指定 要初始化的字段的名称 .fieldname = 在元素之前 价值。例如,给定 遵循结构,

     struct point { int x, y; };
    

    以下初始化

     struct point p = { .y = yvalue, .x = xvalue };
    

    相当于

     struct point p = { xvalue, yvalue };
    

    如果你继续读下去,它解释了 .fieldname 被称为 designator .

    更新: 我不是C99专家,但我 不能 编译代码。以下是我必须做出的改变:

    // header file
    struct foo{
    char* name;
    int value;
    };
    
    //Implementation file
    //struct foo fooElmnt __foo;
    // some code using fooElmnt
    struct foo fooElmnt  = {
        .name = "NAME",
        .value = 123
    };
    

    你能编译它吗?我用过 TCC .

        2
  •  3
  •   nos    15 年前

    这些是c99中引入的指定初始值设定项。你可以读更多 here

    没有他们,你会用

    struct foo fooElmnt __foo = {
        "NAME",
        some_value
    };
    

    虽然在这种情况下,它并不重要-除了c99方式更详细,而且它更容易读取哪个元素初始化为什么。

    如果您的结构有很多成员,并且只需要将其中的一些成员初始化为0以外的其他成员,那么它确实有帮助。

        3
  •  3
  •   philant    15 年前

    这是指定的初始化。这也会根据字段的名称初始化字段,当结构变大时,这比无意义的初始化更具可读性。这是由C99标准引入的。