【问题标题】:How do you initialize a struct with struct members?如何用结构成员初始化结构?
【发布时间】:2014-11-07 15:45:12
【问题描述】:

在 C 中,有没有办法用变量初始化结构成员结构,或者我必须用另一个初始化列表来初始化?我意识到这些问题的措辞非常混乱,所以这里有一个简单的代码示例

#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;
}

假设我定义了这些结构。我想用另一个结构初始化一个ImportantVectorsstruct。有没有可能按照这些思路做点什么?

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'

【问题讨论】:

  • 我尝试将 tempStruct 设为 const,但它给了我与错误消息中的 const 限定符相同的错误。它似乎确实适用于结构的原始成员(在 VS 中)。
  • 看起来类似于这个问题:stackoverflow.com/questions/24090739/… 其中它被描述为编译器中的一个已知错误

标签: c struct initialization


【解决方案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,
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多