在 C99 中,如果x
之前声明过并且是 type v2
,那么我可以这样写:
x = (v2) { 1, 2 };
哪里v2
是:
typedef struct {
int x;
int y;
} v2;
我可以在 C90 中做类似的事情吗?
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};
在没有编译器扩展的情况下,您可以在 C90 中获得的最接近的是:
{
v2 temp = { 1, 2 };
x = temp;
}
您可以将其压缩为一行或用宏替换。(由于 C 没有卫生的宏,但是,当然,您必须小心声明变量的宏。)
不,这是 C99 功能。但是,一些编译器会允许它作为 C89 模式的扩展,例如 gcc。