C-创建匿名结构实例

时间:2019-02-08 04:18:49

标签: c struct compound-literals

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 个答案:

答案 0 :(得分:10)

这称为复合文字,并在C standard的6.5.2.5节中进行了记录。

本节摘录如下:

  

3 由后缀表达式组成的后缀表达式是:   复合文字。它提供了一个未命名的对象,其值为   由初始化程序列表给出。

     

4 如果类型名称指定了未知大小的数组,则该大小由初始化器列表确定,如   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 };