Указатель функции приведен как void без вызова - PullRequest
2 голосов
/ 06 августа 2020

Просматривая некоторый код промежуточного программного обеспечения STM32, я натолкнулся на эту очень странную строку и не могу ее разобрать. Это в основном,

(void)(foo);

Это не приведение указателя void - это было бы просто. Он не вызывает функцию и не приводит ее возвращаемое значение как void - для этого потребуется еще пара скобок. Это похоже на rvalue без lvalue. Это просто запрет на оптимизацию функции? Или он действительно что-то делает?

Вот это в контексте.

// 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;
}

Ответы [ 3 ]

5 голосов
/ 06 августа 2020

Он ничего не делает, кроме одного. Остановить компилятор от жалоб на неиспользуемые переменные. На самом деле, здесь, на SO, это рекомендуется как переносимый способ сделать это: Переносимый макрос параметра UNUSED, используемый в сигнатуре функции для C и 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;
}
3 голосов
/ 06 августа 2020

Что это делает:

(void)(foo);

Приводит выражение foo к типу void. Это способ сказать, что выражение явно не используется.

Если вы посмотрите на определение функции SVCCTL_RegisterCltHandler, вы увидите, что она принимает параметр с именем pfBLE_SVC_Client_Event_Handler. Этот параметр используется в блоке препроцессора #if. Если условие #if ложно, в противном случае этот параметр не будет использоваться, и компилятор выдаст предупреждение о том, что параметр pfBLE_SVC_Client_Event_Handler не используется.

Приведением этого параметра к void в #else блок, он использует значение и заглушает предупреждение компилятора.

0 голосов
/ 06 августа 2020

Это сделано для того, чтобы компилятор не жаловался на то, что foo не используется. Это буквально все. Это похоже на атрибут maybe_unused в C ++.

...