如何抑制未使用的(void **arg)参数引发的编译报错?
错误原因
你之前写的void(arg)语法不标准所以无法生效,该报错是编译时开启了-Wunused-parameter检查且配置了-Werror将警告转为错误,要求函数的所有入参必须被显式使用。
正确的处理方案
按推荐优先级排列如下:
- 通用标准写法(全编译器兼容)
在函数开头添加如下语句即可:
该写法是C语言通用的未使用参数标记方式,所有主流编译器(GCC、Clang、MSVC等)都能识别并关闭对应告警。(void)arg;
大部分项目会封装通用宏提升可读性:
使用时直接调用即可:// 通常定义在项目公共头文件中 #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
相关产品推荐
相关产品推荐

