初始化一个vanilla C结构

时间:2013-01-10 09:31:23

标签: c++ c

我想在C ++标题中添加一个C风格的结构,并在C函数中使用它。但这不起作用:

struct Vertex {
float Position[2];
float Color[4];
};

struct Square{
Vertex vertices[4];
};

其他地方:

float color[4]={rColor, gColor, bColor, alpha};
float halfsize=(float)size/2;

Square square= {
    {{halfsize,halfsize},{color[0],color[1],color[2],color[3]}},
    {{halfsize,-halfsize},{color[0],color[1],color[2],color[3]}}, //error on this line
    {{-halfsize,-halfsize},{color[0],color[1],color[2],color[3]}},
    {{-halfsize,halfsize},{color[0],color[1],color[2],color[3]}}
};

在第二行报告“struct initializer中的多余元素”。

在相关的说明中,是否有更有效的方法将数组color传递给square集?

2 个答案:

答案 0 :(得分:6)

Vertex vertices[4];

的初始值设定项需要add an extra brace
                \/   
Square square= {{
    {{halfsize,halfsize},{color[0],color[1],color[2],color[3]}},
    {{halfsize,-halfsize},{color[0],color[1],color[2],color[3]}}, //error on this line
    {{-halfsize,-halfsize},{color[0],color[1],color[2],color[3]}},
    {{-halfsize,halfsize},{color[0],color[1],color[2],color[3]}}
}};
^

答案 1 :(得分:2)

正如另一个回答者提到的那样,你应该添加一个额外的支撑,然后事情就会起作用。

但是,您也会问这是否是传递color的更有效方法。

恐怕我认为没有。由于C和C ++都没有跟踪数组的长度,并且由于没有用于拼接数组的构造,因此无法向编译器指示您希望复制数组的某个部分。

但是你有效的意思是什么?如果你的意思是“有没有办法可以更快地执行?”然后答案几乎肯定没有。这种初始化将非常快。

如果你的意思是“有没有一种方法可以用更少的代码行编写?”然后答案可能是否定的。六条线很紧。

当然,你正在使用C ++标头,所以我认为你也必须使用C ++编译器,因此在纯C中构建这部分代码似乎毫无意义。你可以将color变成一个STL向量然后为SquareVertex构建一些构造函数,这些构造函数初始化此向量。它不会占用更多的代码,并且可能会降低意外错误的可能性。

或者,如果你已经设置了C并计划让这些代码一次又一次出现,你可以考虑使用一个宏(如下所示,或者对于整个血腥的东西,但是我会说它会最好把它放在一个函数中):

#define RGB_INIT {color[0],color[1],color[2],color[3]}

虽然宏确实存在危险。