You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:36:02