代码之家  ›  专栏  ›  技术社区  ›  Jet Blue

C-创建匿名结构实例

  •  11
  • Jet Blue  · 技术社区  · 6 年前

    在里面 this code

    typedef struct
    {
        int line;
        int column;
    } Pos;
    

    Pos get_pos ( int delta )
    {
        ...
    
        return ( Pos ){ f->line, f->column + delta };
    }
    

    那条线,, return ( Pos ){ f->line, f->column + delta } 似乎正在创建结构的匿名实例 Pos

    1 回复  |  直到 6 年前
        1
  •  10
  •   dbush    6 年前

    复合文字 ,并记录在本规范第6.5.2.5节中 C standard

    本节摘录如下:

    3. 复合文字 由初始值设定项列表给出。

    如果类型名称指定了大小未知的数组,则大小由中指定的初始值设定项列表确定 6.7.9,复合文字的类型是完整数组类型的类型。否则(当类型名称指定 类型名称。无论哪种情况,结果都是左值。

    5. 复合文字的值是由初始值设定项列表初始化的未命名对象的值。如果化合物 文本发生在函数体之外,对象具有 静态存储时间;否则,它会自动存储 与封闭块关联的持续时间。

    struct ,但也可以为数组创建它们。第8段举了一个例子:

    8. 示例1文件范围定义

    int *p = (int []){2, 4};
    

    初始化 p 指向数组的第一个元素 两个整数,第一个值为2,第二个值为, 保持不变。未命名对象具有静态存储持续时间。

    还要注意,复合文字是左值,这意味着您可以获取其地址:

    Pos *p = &( Pos ){ f->line, f->column + delta };
    

    还可以将复合文字与 指定初始化

    return ( Pos ){ .line=f->line, .column=f->column + delta };