在C中,有没有办法用变量初始化struct member struct,还是必须用另一个初始化列表初始化?我意识到这些问题的措辞非常令人困惑,所以这里是一个简单的代码示例
#define MAX_VECTOR_SIZE 10
struct ImmutableVectorC
{
const short vectorSize;
int vectorElements[MAX_VECTOR_SIZE];
};
struct ImportantVectors
{
struct ImmutableVectorC vec1;
struct ImmutableVectorC vec2;
struct ImmutableVectorC vec3;
struct ImmutableVectorC vec4;
struct ImmutableVectorC vec5;
}
假设我定义了这些结构。我想用另一个结构初始化ImportantVectors
struct
。是否有可能沿着这些方向做点什么?
int main()
{
struct ImmutableVectorC tempStruct =
{
.vectorSize = (short)2,
.vectorElements =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
struct ImportantVectors initial =
{
.vec1 = tempStruct,
.vec2 = tempStruct,
.vec3 = tempStruct,
.vec4 = tempStruct,
.vec5 = tempStruct
};
}
Visual Studio提供了神秘的错误,我不确定它是因为这些不是编译时常量,或者是一些内存管理问题等。
编辑:VS给我的错误是:
error C2440: 'initializing' : cannot convert from 'struct ImmutableVectorC' to 'const short'
答案 0 :(得分:1)
首先我的MSVC编译器并不喜欢你的代码。我必须使用;
结束所有结构元素声明而不是,
:
struct ImmutableVectorC
{
short vectorSize;
int vectorElements[MAX_VECTOR_SIZE];
};
struct ImportantVectors
{
struct ImmutableVectorC vec1;
struct ImmutableVectorC vec2;
struct ImmutableVectorC vec3;
struct ImmutableVectorC vec4;
struct ImmutableVectorC vec5;
};
接下来,tempStruct
的初始化不允许使用.name=
构造,而是希望:
struct ImmutableVectorC tempStruct =
{
(short)2,
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
但真正的问题是我的MSVC C编译器在初始化时不允许结构复制,而是坚持改为:
struct ImportantVectors initial = {
{
(short)2,
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
...
};
但我可以使用clang和gcc进行测试,并且在初始化时都接受字段名和结构副本(但在结构字段声明中最终需要;
):
struct ImportantVectors initial2 =
{
.vec1 = tempStruct,
.vec2 = tempStruct,
.vec3 = tempStruct,
.vec4 = tempStruct,
.vec5 = tempStruct,
};