如何在VC ++中为union赋值

时间:2018-05-14 06:00:24

标签: visual-c++ visual-studio-2015

C中有一个union并嵌入到C ++中,如下所示:

typedef union MyUnion MyUnion_;
union MyUnion{
    ULONG   mLong;
    char    mChar;
...
};

当我尝试初始化时:

MyUnion_ test;
test = (MyUnion_)NULL;

这可以由Mingw32编译,但是给出了

error: C2440: 'type cast': cannot convert from 'void *' to 'MyUnion_'
VC ++中的

(VS2015)。那么如何做演员&在VC ++编译器中初始化union

现在我这样做:

MyUnion_ test;
test.mLong = NULL;

但是当将union作为参数传递时,这会使程序看起来很糟糕。

void test(MyUnion_ u)

ULONG i = 0;

// mingw32
test((MyUnion_)i);

// vc++
MyUnion_ temp;
temp.mLong = i;
test(temp);

2 个答案:

答案 0 :(得分:0)

默认构造函数?

typedef union MyUnion MyUnion_;
union MyUnion {
    ULONG   mLong;
    char    mChar;
    MyUnion(): mLong(0) {}
};

int main()
{
    MyUnion_ temp;
    return 0;
}

答案 1 :(得分:0)

使用支持C ++ 11统一初始化语法的编译器,您可以使用带有单个值的支撑初始值设定项,该值将用于初始化union的第一个非静态字段...

MyUnion test{ 0 };

您可以在上面的代码中使用NULL而不是零,但使用mLong初始化ULONGNULL}似乎很困惑。

如果必须在声明声明后设置变量,也可以在赋值语句中使用支撑初始化...

MyUnion test{ 0 };

// ...

test = { 3 };

请注意,支持初始化程序语法也可用于较旧的编译器,这些编译器为以前称为C ++ 0x

的实验提供支持

Visual Studio 2015 C ++支持支持的初始值设定项,除非您使用.c扩展名编译文件或使用/TC switch to compile as C code(而不是C ++代码)。

较旧的C ++(和C)编译器

当使用不支持强制初始化的编译器时,可以在声明中使用旧的赋值初始化语法...

MyUnion_ test = { 0 };

...但不在作业陈述中。

转换为联合类型

根据this IBM Knowledge Center article转换为联合类型是对C99的扩展“...实现以便于移植使用GNU C开发的程序” - 这表明它不是标准C.

Microsoft documentation表示对于union,struct或数组,C 中没有合法演员

C ++ 中,如果存在合适的构造函数,则可以转换为联合类型...

union MyUnion {
   unsigned long   mLong;
   char            mChar;

   MyUnion(unsigned long val) { mLong = val; };
};


// valid cast 
test = (MyUnion)3ul;

// invalid cast - no suitable constructor exists
void * ptr = 0;
test = (MyUnion)ptr;