C90复合文字

时间:2012-05-24 19:08:26

标签: c standards c99 ansi c89

在C99中,如果先前声明x并且类型为v2,那么我可以写:

x = (v2) { 1, 2 };

其中v2是:

typedef struct {
    int x;
    int y;
} v2;

我可以在C90做类似的事情吗?

3 个答案:

答案 0 :(得分:2)

AFAIK,复合文字完全是在C99中引入的。但是,如果您使用的是GCC,则此功能可用作扩展程序。引用GCC docs

  

ISO C99支持复合文字。复合文字看起来像包含初始值设定项的强制转换。它的值是转换中指定类型的对象,包含初始值设定项中指定的元素;这是一个左值。 作为扩展,GCC支持C90模式和C ++中的复合文字

关于海湾合作委员会这一特点的另一个注意事项:

  

作为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};

答案 1 :(得分:2)

在没有编译器扩展的情况下,您可以在C90中获得的最接近的是:

{
    v2 temp = { 1, 2 };
    x = temp;
}

您可以压缩到一行或用宏替换。 (但是,由于C没有卫生的宏,你必须小心使用声明变量的宏。)

答案 2 :(得分:1)

不,这是C99功能。但是,一些编译器会允许它作为C89模式的扩展,例如, GCC。