【发布时间】:2012-05-24 19:08:26
【问题描述】:
在 C99 中,如果 x 被提前声明并且是 v2 类型,那么我可以这样写:
x = (v2) { 1, 2 };
v2 在哪里:
typedef struct {
int x;
int y;
} v2;
我可以在 C90 中做类似的事情吗?
【问题讨论】:
在 C99 中,如果 x 被提前声明并且是 v2 类型,那么我可以这样写:
x = (v2) { 1, 2 };
v2 在哪里:
typedef struct {
int x;
int y;
} v2;
我可以在 C90 中做类似的事情吗?
【问题讨论】:
AFAIK,复合文字是在 C99 中准确引入的。但是,如果您使用的是 GCC,则此功能可作为扩展使用。引用GCC docs:
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};
【讨论】:
在没有编译器扩展的情况下,您可以在 C90 中获得最接近的结果是:
{
v2 temp = { 1, 2 };
x = temp;
}
您可以将其压缩为一行或替换为宏。 (不过,由于 C 没有卫生的宏,当然,你必须小心声明变量的宏。)
【讨论】:
不,这是 C99 功能。但是,一些编译器会允许它作为 C89 模式下的扩展,例如gcc。
【讨论】: