初始化一个普通的C结构

Initializing a vanilla C struct

本文关键字:结构 一个 初始化      更新时间:2023-10-16

我想在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]}}
};

在第二行报告"结构初始化项中有多余元素"。

在相关的注意事项上,是否有更有效的方法将数组color传递到square集?

您需要为Vertex vertices[4];的初始化项添加一个额外的大括号

                /   
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]}}
}};
^

正如另一个回答者所提到的,您应该添加一个额外的大括号,然后事情就会正常工作。

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

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

但是你说的有效率到底是什么意思?如果你的意思是"有没有一种执行速度更快的方法?"那么答案几乎肯定是否定的。这个初始化将非常快。

如果你的意思是"有没有一种方法可以用更少的代码行来编写?"那么答案可能还是否定的。六行太紧了

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

或者,如果你设置在C语言上,并计划让这些代码一次又一次地出现,你可以考虑使用一个宏(如下所示,或者整个血腥的事情,但我想说,最好把它放在一个函数中):

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