C - 促进匿名结构实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - 促进匿名结构实例相关的知识,希望对你有一定的参考价值。

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 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 ;

以上是关于C - 促进匿名结构实例的主要内容,如果未能解决你的问题,请参考以下文章

C语言 匿名联合体和匿名结构体

C语言中的匿名结构体

C语言中的匿名结构体

golang中级进阶(二):结构体

Go语言基础:结构体

Go语言基础:结构体