c - 函数指针转换为 void 而不被调用
问题描述
在阅读一些 STM32 中间件代码时,我遇到了这个非常奇怪的行并且无法解析它。基本上,
(void)(foo);
这不是 void 指针强制转换 - 这很简单。它没有调用函数并将其返回值转换为 void - 这将需要更多的括号。它看起来像一个没有左值的右值。这只是防止功能被优化的无操作吗?或者它实际上有什么作用?
这是在上下文中。
// SVCCTL_EvtAckStatus_t is just an enum typedef
typedef SVCCTL_EvtAckStatus_t (*SVC_CTL_p_EvtHandler_t)(void *p_evt);
void SVCCTL_RegisterCltHandler( SVC_CTL_p_EvtHandler_t pfBLE_SVC_Client_Event_Handler )
{
#if (BLE_CFG_CLT_MAX_NBR_CB > 0)
// Ignore all this
SVCCTL_CltHandler.SVCCTL_CltHandlerTable[SVCCTL_CltHandler.NbreOfRegisteredHandler] = pfBLE_SVC_Client_Event_Handler;
SVCCTL_CltHandler.NbreOfRegisteredHandler++;
#else
// This is the weird stuff
(void)(pfBLE_SVC_Client_Event_Handler);
#endif
return;
}
解决方案
它什么也没做,除了一件事。阻止编译器抱怨未使用的变量。实际上,在 SO 上,它被推荐为一种可移植的方式:Portable UNUSED parameter macro used on function signature for C and C++
例子:
int somefunction(int a, int b, int c)
{
(void)(c); // c is reserved for future usage,
//stop the compiler from issuing "unused parameter" warning
return a+b;
}
推荐阅读
- javascript - JS 在表单允许提交之前输入正确的短语
- node.js - 使用 Node.js 和 Express 的在线编译器
- scala - Gatling Scala 日期随机格式不正确
- c# - Visual Studio 中未抛出预期异常,Linq Select 语句意外过滤结果
- c# - 如何将 4 个参数从后面的代码传递给客户端
- java - 为什么这个赋值在 Java 泛型中是非法的?
- node.js - 为什么 AWS EBS 的日志流无法正常工作?
- html - SASS 基于侧边栏改变 flex 布局
- geode - 对于使用集群配置为 true 的 apache geode 3 服务器集群,复制区域仅出现在 1 台服务器上,而不是全部 3
- java - Discord bot 每 30 秒更改一次状态活动 jda