VC++中如何为union类型进行赋值与初始化?
在VC++里优雅搞定Union的类型转换与初始化
哎,MinGW32和VC对union的类型转换规则差异真的挺闹心的——前者宽松惯了允许直接把指针/整数强转成union,后者严格遵循C标准,这种跨类型的强制转换直接就给你报错。我给你分享几个实用的方案,不管是初始化还是传参都能搞定:
方案1:用聚合初始化(C++11及以上首选)
如果你的项目能用上C++11或更高版本,聚合初始化绝对是最简洁的方式,不管是初始化变量还是传参都一步到位:
// 初始化变量,自动给第一个成员mLong赋值 MyUnion_ test = {0}; // 这里用0比NULL更清晰,避免指针/整数混淆 // 传参时直接用聚合初始化,不用临时变量 test({i});
要是你想初始化union里的其他成员(比如mChar),C++20开始还支持指定成员名的写法:
MyUnion_ test = {.mChar = 'a'}; // 精准初始化mChar
方案2:封装辅助转换函数(兼容旧版本)
如果得兼容C++11之前的版本,写个简单的转换函数就能让传参变简洁:
// 可以加inline避免函数调用开销 inline MyUnion_ ulong_to_MyUnion(ULONG val) { MyUnion_ u; u.mLong = val; return u; } // 传参时直接调用就行 test(ulong_to_MyUnion(i));
要是需要支持多个成员的转换,还可以重载这个函数:
inline MyUnion_ char_to_MyUnion(char c) { MyUnion_ u; u.mChar = c; return u; }
方案3:给Union加构造函数(C++专属)
如果是纯C++代码使用这个union,直接给它加构造函数是最直观的:
typedef union MyUnion MyUnion_; union MyUnion{ ULONG mLong; char mChar; // 针对ULONG的构造函数 MyUnion(ULONG val) : mLong(val) {} // 针对char的构造函数 MyUnion(char c) : mChar(c) {} }; // 这下初始化和传参都跟用普通类型一样方便 MyUnion_ test(0); test(i); // 直接把ULONG转成MyUnion_ test('x'); // 传char也没问题
不过要注意:加了构造函数后,union就不再是聚合类型了,不能用聚合初始化,而且这种写法只能在C++里用,C代码编译会报错。
关于你当前写法的补充
你现在用的test.mLong = NULL;完全合法,就是传参时要临时变量有点麻烦,上面的方案都能解决这个痛点。另外提个小建议:给ULONG类型赋值时用0比NULL更清晰,毕竟NULL在C++里本质是指针相关的宏,避免混淆整数和指针类型。
内容的提问来源于stack exchange,提问作者JustWe
相关产品推荐
相关产品推荐

