我们许多人都知道这行得通:
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;
创建的对象完全相同?
答案 0 :(得分:2)
我是在C99中引入的,它与其他常量和文字之间没有区别。
通过网络:
复合文字表达式构造了一个未命名的对象 按类型指定的类型,并按指定的方式对其进行初始化 初始化列表。
复合文字的类型为type(类型为数组时除外) 大小未知;它的大小是从初始化列表推导出的,如 数组初始化)。
复合文字的值类别为左值(其地址可以为 采取)。
复合文字评估的未命名对象具有静态 如果复合文字出现在文件范围和 如果复合文字出现在块中,则自动存储持续时间 范围(在这种情况下,对象的生存期在 封闭的块)。