参考文档
复合字面量介绍
假设给带int类型的形参函数传递一个值,可以传递int类型的变量,也可以传递int类型常量,但是对于带数组形参的函数则不一样,可以传递数组,但是不支持传递数组常量,由此C99新增了复合字面量的用法,字面量是指除符号常量外的常量。
例如:10是int的类型的字面量,10.24是double类型的字面量,”abc”是字符串的字面量等,如果有数组或者结构体的字面量,这样使用起来会更方便。
数组字面量
数组的复合字面量和数组初始化列表差不多,前面使用括号括起来的类型名。
例如,这是个数组定义:int age[2] = [19, 20];
使用复合字面量创建一个匿名数组:(int [2]){19, 20};
可见去掉定义中的数组名,留下的int[2]就是复合字面量的类型名,整个就是数组字面量。
使用数组字面量时可以像定义数组一样省略数组大小,也可以应用于二维或多维数组。
还可构造一个字符串数组,将复合字面量强制转换为指向其第一个元素的指针,如:char **foo = (char *[]) { "x", "y", "z" };
结构体字面量
结构体的复合字面量的指定类型是一个结构体。
假设,struct foo 和 structure 声明如:struct foo {int a; char b[2];} structure;
使用复合字面量构造 struct foo 的示例:structure = ((struct foo) {x + y, 'a', 0});
这等效于:{ struct foo temp = {x + y, 'a', 0}; structure = temp; }
复合字面量生命周期
在 C 语言中,复合字面量指定具有静态或自动存储持续时间的未命名对象。在 C++ 中,复合字面量指定一个临时对象,该对象仅在其完整表达式结束之前存在。因此,采用复合字面量的子对象地址的定义良好的 C 代码在 C++ 中可以是未定义的,因此 G++ 拒绝将临时数组转换为指针。例如,如果上面的数组复合字面量示例出现在函数内部,则在 C++ 中对 foo 的任何后续使用都会产生未定义的行为,因为数组的生命周期在 foo 的声明之后结束。
作为一种优化,G++ 有时会为数组复合字面量提供更长的生命周期:当数组出现在函数外部或具有 const 限定类型时。如果 foo 及其初始值设定项具有 char *const 而不是 char * 类型的元素,或者如果 foo 是全局变量,则数组将具有静态存储持续时间。但是,避免在 C++ 代码中使用数组复合字面量可能是最安全的。
复合字面量应用
- 函数参数是结构体、数组,用复合字面量传参。
- 程序运行中想给char数组赋字符串。