首页 > 解决方案 > 函数指针转换为 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;
}

标签: csyntaxembeddedcompiler-optimization

解决方案


它什么也没做,除了一件事。阻止编译器抱怨未使用的变量。实际上,在 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;
}

推荐阅读