硕! 2024-06-14 09:22 采纳率: 28.6%
浏览 3
已结题

CONST修饰结构体 赋值的方式产生了错误。

img


请问这两种方式有什么不同,为什么main里面的会报错呢?
请问这两种方式有什么不同,为什么main里面的会报错呢?
请问这两种方式有什么不同,为什么main里面的会报错呢?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-14 09:22
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码片段来看,你遇到了C语言中关于const修饰符以及结构体赋值的问题。下面将详细解释两段代码的区别,并分析为何在main函数中的赋值方式会导致编译错误。

    第一段代码(正确示例)

    static ble_gap_scan_params_t const m_scan_params = {
        .active = 1,       // 主动扫描
        .interval = 0x00A0, // 扫描间隔
        .window = 0x0050,   // 扫描窗口
        .timeout = 0x0000,  // 扫描超时
        .scan_phys = 0x01,  // 扫描物理位域
        .filter_policy = 0x00 // 过滤策略
    };
    

    在这段代码中,m_scan_params被声明为const,意味着一旦初始化后其成员就不能再修改。初始化时,结构体成员通过初始化列表直接赋值,这是正确的初始化方法。

    第二段代码(错误示例)

    ble_gap_scan_params_t const ble_gap_sp;
    ble_gap_sp.active = 1;
    ble_gap_sp.interval = 0x00a0;
    ble_gap_sp.window = 0x0050;
    ble_gap_sp.timeout = 0x0000;
    ble_gap_sp.scan_phys = 0x01;
    ble_gap_sp.filter_policy = 0x00;
    

    main函数中,你尝试对const类型的结构体变量ble_gap_sp的成员进行赋值。这违反了C语言中const变量不可修改的规定,因此编译器会报错。这是因为当一个变量被声明为const时,它在初始化之后就不能再被修改,任何试图修改它的操作都会导致编译错误。

    解决方案

    如果你想要在运行时动态设置结构体成员的值,那么就不应该使用const修饰符。如果const是必要的,例如为了确保某些配置参数在程序运行过程中不会被意外更改,那么你应该在声明时立即初始化这些参数,就像第一段代码中那样。

    示例代码

    ble_gap_scan_params_t ble_gap_sp; // 去掉const修饰符
    ble_gap_sp.active = 1;
    ble_gap_sp.interval = 0x00a0;
    ble_gap_sp.window = 0x0050;
    ble_gap_sp.timeout = 0x0000;
    ble_gap_sp.scan_phys = 0x01;
    ble_gap_sp.filter_policy = 0x00;
    

    这样修改后,ble_gap_sp就可以在运行时被修改了。如果你确实需要使用const,请确保所有成员都在声明时初始化,以避免编译错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月14日

悬赏问题

  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题