在C99中,如果先前声明x
并且类型为v2
,那么我可以写:
x = (v2) { 1, 2 };
其中v2
是:
typedef struct {
int x;
int y;
} v2;
我可以在C90做类似的事情吗?
答案 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。