如何在C++中通过内联构造函数初始化含数组成员的结构体
问题解答
首先给出明确结论:
- 如果你使用的是C++11及以上版本,完全可以在
MplsTunnel_()的构造函数初始化列表中完成_dmac数组的初始化 - 如果你需要兼容C++03及更早的旧标准,无法在初始化列表中直接初始化数组,需要在构造函数体内完成赋值操作
C++11及以上版本的实现代码
你只需要修改构造函数的初始化列表,用花括号对_dmac做聚合初始化即可:
typedef struct MplsTunnel_ { uint32_t _port; uint32_t _iflIndex; uint16_t _vsi; int _vcEncapAccess; uint8_t _dmac[6]; // 初始化列表直接初始化数组 MplsTunnel_() : _port(0), _iflIndex(0), _vsi(0), _vcEncapAccess(0), _dmac{0,0,0,0,0,0} {} } MplsTunnel_t;
如果需要给_dmac设置自定义初始值,直接替换花括号内的数值即可,比如要初始化为MAC地址00:11:22:33:44:55,就写成_dmac{0x00, 0x11, 0x22, 0x33, 0x44, 0x55}。
C++03兼容版本的实现代码
旧标准不支持初始化列表初始化数组,需要在构造函数体内用memset或者memcpy完成初始化:
typedef struct MplsTunnel_ { uint32_t _port; uint32_t _iflIndex; uint16_t _vsi; int _vcEncapAccess; uint8_t _dmac[6]; MplsTunnel_() : _port(0), _iflIndex(0), _vsi(0), _vcEncapAccess(0) { // 初始化为全0 memset(_dmac, 0, sizeof(_dmac)); // 自定义初始值写法示例 // uint8_t init_mac[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; // memcpy(_dmac, init_mac, sizeof(_dmac)); } } MplsTunnel_t;
注意事项
- 如果你没有手动初始化
_dmac,它的初始值是内存中的随机脏数据,使用前必须赋值否则会出现未定义行为 - 也可以将
uint8_t _dmac[6]替换为std::array<uint8_t, 6> _dmac,用法和原生数组几乎一致,还支持更多STL工具函数,代码安全性更高
内容的提问来源于stack exchange,提问作者Barmesh Pandey
相关产品推荐
相关产品推荐

