3

在 C99 中,如果x之前声明过并且是 type v2,那么我可以这样写:

x = (v2) { 1, 2 };

哪里v2是:

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

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

4

3 回答 3

2

AFAIK,复合文字是在 C99 中准确引入的。但是,如果您使用的是 GCC,则此功能可作为扩展使用。引用GCC 文档

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

关于 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};

以上几行等价于以下内容:

static struct foo x = {1, 'a', 'b'};
static int y[] = {1, 2, 3};
static int z[] = {1, 0, 0};
于 2012-05-24T19:12:15.773 回答
2

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

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

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

于 2012-05-24T19:54:10.140 回答
1

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

于 2012-05-24T19:11:26.413 回答