在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
的匿名实例。这种技术叫什么?它如何工作?在哪里可以了解更多信息?
答案 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 };