ISO C99确实支持复合文字(根据 this)。然而,目前只有GNU 扩展通过复合字面量提供具有静态存储持续时间的对象的初始化,但仅适用于 C90 和 C++。
复合文字看起来像包含初始化程序的强制转换。它的值是强制转换中指定类型的对象,包含初始化器中指定的元素;它是一个左值。作为扩展, GCC 支持 C90 模式和 C++ 中的复合文字,尽管 C++ 中的语义有些不同。
通常,指定的类型是结构。假设struct foo和结构声明如下:
struct foo {int a; char b[2];} structure;
struct foo下面是使用复合文字构造 a 的示例:
structure = ((struct foo) {x + y, 'a', 0});
这相当于编写以下内容:
{
struct foo temp = {x + y, 'a', 0};
structure = temp;
}
GCC 扩展:
作为 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};
注意:
您帖子中的编译器标签仅包括 GCC;但是,您可以与 C99(和多个 GCC 版本)进行比较。值得注意的是,GCC 比较大的 C 标准组更快地向其编译器添加扩展功能。这有时会导致错误行为和版本之间的不一致。同样重要的是要注意,对众所周知且流行的编译器的扩展,但不符合公认的 C 标准,会导致潜在的不可移植代码。在决定使用尚未被较大的 C 工作组/标准组织接受的扩展时,始终值得考虑目标客户。(参见ISO(维基百科)和ANSI(维基百科)。)
在几个例子中,更小更灵活的开源 C 工作组或委员会通过添加扩展来回应用户群表达的兴趣。例如,switch case range extension。