【问题标题】:Function pointer cast as void without being called函数指针转换为 void 而不被调用
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是做什么的:

    (void)(foo);
    

    将表达式foo 转换为类型void。这是一种表示明确未使用表达式的方式。

    如果您查看函数SVCCTL_RegisterCltHandler 的定义,您会发现它接受了一个名为pfBLE_SVC_Client_Event_Handler 的参数。此参数用于#if 预处理器块。如果#if 条件为假,则此参数将未被使用,编译器将发出警告,指出参数pfBLE_SVC_Client_Event_Handler 未使用。

    通过将此参数转换为#else 块中的void,它使用该值并消除编译器警告。

    【讨论】:

    • 为了迂腐,它将表达式 (foo) 转换为类型 void
    【解决方案3】:

    这是为了防止编译器抱怨 foo 未被使用。字面意思就是这样。这就像 C++ 中的 maybe_unused 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 2012-11-21
      • 2014-01-13
      • 1970-01-01
      • 2019-04-13
      • 2014-10-22
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多