【发布时间】:2020-08-06 00:43:30
【问题描述】:
在阅读一些 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;
}
【问题讨论】:
-
你有
SVC_CTL_p_EvtHandler_t的参考吗?它可能有助于解决此查询。 -
我认为这里有答案:stackoverflow.com/questions/34288844。虽然这个问题是针对 C++ 的,但我认为答案也适用于 C。
-
我的猜测是(1)该行本身是为了抑制关于
pfBLE_SVC_Client_Event_Handler未被使用的警告,以及(2)正如@augurar 所建议的那样,(void)是为了抑制一些其他警告。
标签: c syntax embedded compiler-optimization