我有以下类型:
typedef float vec4[4]; // from cglm
typedef struct Node Node;
struct Node {
float expand;
vec4 color;
Node *children;
}
由于某种原因,
color
字段的float[4]
类型是..溢出?进入其后的田野。例如,当使用以下文字时:
Node test1 = (Node) {
.expand = 1.0f,
.color = (vec4) { 0, 0, 1, 1 },
.children = NULL
};
编译器认为
color
和 children
字段都应该是单个 float
s?:
error: initializing 'float' with an expression of incompatible type 'vec4' (aka 'float[4]')
error: initializing 'float' with an expression of incompatible type 'void *'
如何在该结构文字中正确提供
float[4]
值,而不破坏后续字段?
(vec4) { 0, 0, 1, 1 }
是一个 复合文字,它确实是一个数组。但是,您不能使用数组(字符串文字除外)来初始化数组,就像您不能将数组分配给数组一样。在 C 语言中,数组从来都不是可以作为单个对象进行操作的一流对象;它们始终是多种事物的集合。此外,复合文字是后来添加到语言中的。
初始化数组的语法是在大括号中列出其元素的初始值。所以只需将
.color = (vec4) { 0, 0, 1, 1 },
更改为 .color = { 0, 0, 1, 1 },
。