如何用联合初始化结构?

时间:2019-01-17 07:46:53

标签: c++ visual-c++

如何正确初始化包含联合的结构?目前,我收到一个错误// error C2440: 'initializing': cannot convert from 'float' to 'const char *'

#include <stdio.h>

using namespace std;

typedef enum {STRING, REAL, POINTER } Type;

const struct Entry {
    union {
        const char *string;
        float real;
        void *pointer;
    };
    Type type;
    LPCSTR Key;
    LPCSTR Name;
}f;

const Entry Entries[] = {
    {{0.5f}, REAL, "Key", "Name" } // error C2440: 'initializing': cannot convert from 'float' to 'const char *'
};

int main(int argc, char **argv)
{
    for (int i = 0; i < size(Entries); i++)
    {
        switch Entries[i].type
        {
            case STRING:
                printf("Type string; Value: %s\n", Entries[i].string);
            case REAL:
                printf("Type string; Value: %d\n", Entries[i].real);
        }
    }
}

2 个答案:

答案 0 :(得分:4)

初始化联合时,仅 first 成员将被初始化。重新排列联合,使float real成为联合的第一个成员。

当然,这意味着您不能在直接初始化中使用其他成员。

另一种解决方案是将一个构造函数添加到联合中,例如一个real成员,一个string成员和一个pointer成员。

答案 1 :(得分:0)

您要使用并集的原因是什么?联合非常适合节省内存。在c ++中,很少需要使用它们。 我知道这不是您问题的答案,但请考虑是否需要在该项目中使用它们。