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

如何抑制未使用的(void **arg)参数引发的编译报错?

错误原因

你之前写的void(arg)语法不标准所以无法生效,该报错是编译时开启了-Wunused-parameter检查且配置了-Werror将警告转为错误,要求函数的所有入参必须被显式使用。

正确的处理方案

按推荐优先级排列如下:

  • 通用标准写法(全编译器兼容)
    在函数开头添加如下语句即可:
    (void)arg;
    
    该写法是C语言通用的未使用参数标记方式,所有主流编译器(GCC、Clang、MSVC等)都能识别并关闭对应告警。
    大部分项目会封装通用宏提升可读性:
    // 通常定义在项目公共头文件中
    #define UNUSED_PARAM(x) (void)(x)
    
    使用时直接调用即可:
    UNUSED_PARAM(arg);
    
  • 省略参数名(C23及以上标准支持)
    如果你的编译环境支持C23及以上的C标准,可以直接在函数定义处省略不需要使用的参数名,仅保留类型和注释说明:
    bool decodeString(pb_istream_t *stream, const pb_field_t *field, void ** /* arg */)
    
    这种方式不需要在函数体内加额外语句,代码更简洁。
  • 编译器特定属性标记(仅适用GCC/Clang)
    如果你使用GCC或Clang编译器,可以直接在参数声明处加unused属性标记:
    bool decodeString(pb_istream_t *stream, const pb_field_t *field, void **arg __attribute__((unused)))
    
    该写法不兼容其他编译器,跨平台项目不推荐优先使用。

特殊说明

该函数是nanopb库的解码回调函数,即使你不需要使用arg参数也不要删除该参数,否则会和回调签名不匹配,导致运行时出现内存访问异常。


内容的提问来源于stack exchange,提问作者razz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:30:01