如何使用struct成员初始化结构?

时间:2014-11-07 15:45:13

标签: c struct initialization

在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'

1 个答案:

答案 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,
};