复合文字(compound literal)看起来就像一个使用大括号聚集在一起的初始化列表。它的价值是在某类型的对象的计算,包含在初始化中指定的元素。不像一个计算的结果,复合文字是左值。ISO C99后来支持复合文字。作为一个扩展,GCC也在C90模式和C++中支持复合文字,虽然解释如下,C++的语义有所不同。
本文地址:http://wuyudong.com/2016/08/26/2633.html,转载请注明源地址。
通常,一个复合文字的指定类型是一个结构体。假设struct foo结构声明如下所示:
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++中是危险的,如下文所解释。如果所有的复合文字的元素是 适用于静态存储期的对象初始化简单的常量表达式,然后复合文字可以强制转换为指向其第一个元素的指针和使用这样一个初始值,如下所示:
char **foo = (char *[]) { "x", "y", "z" };
复合文字也可以用于数值类型和联合类型。在下面的例子中,变量 i 被初始化为值 2,递增的复合文字创建的未命名对象的结果。
int i = ++(int) { 1 };
作为一个 GNU 的扩展, GCC允许复合文字初始化在静态存储中的对象 (这个在 ISO C99 中不允许,因为初始值不是常量)。如果复合文字的类型和对象的类型匹配,对象被初始化为“括号”里面的列表值。复合文字的元素必须是常量。如果被初始化的对象具有未知大小的数组类型,则该大小由复合字面值的大小决定。
static struct foo x = (struct foo) {1, 'a', 'b'}; static int y[] = (int []) {1, 2, 3}; static int z[] = (int [3]) {1};
上面的代码等价于:
static struct foo x = {1, 'a', 'b'}; static int y[] = {1, 2, 3}; static int z[] = {1, 0, 0};
在C语言中,复合文字指定一个静态或自动存储期命名的对象。
参考资料
http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html
Comments