函数参数匿名结构

时间:2018-09-05 15:21:32

标签: c struct casting standards


我们许多人都知道这行得通:

struct data_s
{
    uint32_t p_1;
    uint32_t p_2;
    uint32_t p_3;
    uint32_t p_4;
};

void foo(struct data_s data)
{
    printf("p1: %d\r\n", data.p_1);
    printf("p2: %d\r\n", data.p_2);
    printf("p3: %d\r\n", data.p_3);
    printf("p4: %d\r\n", data.p_4);
}

int main(void)
{
    foo((struct data_s){
            .p_1 = 1,
            .p_2 = 2,
            .p_3 = 3,
            .p_4 = 4});
}

我已经看过很多次了,但是现在在C参考手册中找不到关于它的任何内容。是否定义了此构造标准或实现?

此外,这种类型转换有点奇怪,因为它比“将类型强制转换为这种类型”更像是“我将告诉编译器如何分配,分配什么以及如何对其进行排列”。传递给函数的参数的内存中的数据布局是否与struct data_s obj;创建的对象完全相同?

1 个答案:

答案 0 :(得分:2)

这是compound literal

我是在C99中引入的,它与其他常量和文字之间没有区别。

通过网络:

  

复合文字表达式构造了一个未命名的对象   按类型指定的类型,并按指定的方式对其进行初始化   初始化列表。

     

复合文字的类型为type(类型为数组时除外)   大小未知;它的大小是从初始化列表推导出的,如   数组初始化)。

     

复合文字的值类别为左值(其地址可以为   采取)。

     

复合文字评估的未命名对象具有静态   如果复合文字出现在文件范围和   如果复合文字出现在块中,则自动存储持续时间   范围(在这种情况下,对象的生存期在   封闭的块)。