C - 促进匿名结构实例

问题描述 投票:12回答:1

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的匿名实例。这是什么技术,即,它是如何工作的?我在哪里可以详细了解一下?

c struct compound-literals
1个回答
10
投票

这就是所谓的复合文字,并且在C standard的部分6.5.2.5中记载。

本节的摘录如下:

3,它由一个括号的类型名称后面初始化的brace-封闭列表的后缀表达式是字面的化合物。它提供了一个未命名的对象,其值由初始化列表给出。

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 };
© www.soinside.com 2019 - 2024. All rights reserved.