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);
答案 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
初始化ULONG
(NULL
}似乎很困惑。
如果必须在声明声明后设置变量,也可以在赋值语句中使用支撑初始化...
MyUnion test{ 0 };
// ...
test = { 3 };
请注意,支持初始化程序语法也可用于较旧的编译器,这些编译器为以前称为C ++ 0x
的实验提供支持 Visual Studio 2015 C ++支持支持的初始值设定项,除非您使用.c
扩展名编译文件或使用/TC
switch to compile as C code(而不是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;