Оператор только с именем переменной, приведенным (void) в C

В процедуре инициализации RTEMS я вижу этот код ниже.

void boot_card(const char *cmdline)
{
  rtems_interrupt_level  bsp_isr_level;

  /*
   * Special case for PowerPC: The interrupt disable mask is stored in SPRG0.
   * It must be valid before we can use rtems_interrupt_disable().
   */
  #ifdef PPC_INTERRUPT_DISABLE_MASK_DEFAULT
    ppc_interrupt_set_disable_mask( PPC_INTERRUPT_DISABLE_MASK_DEFAULT );
  #endif /* PPC_INTERRUPT_DISABLE_MASK_DEFAULT */

  /*
   *  Make sure interrupts are disabled.
   */
  (void) bsp_isr_level;      // <--- 
  rtems_interrupt_disable( bsp_isr_level );
  -- continues--

В приведенном выше коде в начале bsp_isr_level объявляется как тип rtems_interrupt_level (который в конечном счете является типом, определенным как unsigned int).
Но какая линия (void) bsp_isr_level; делать? (помечено //<- выше). Это не переменная, переданная в качестве аргумента функции, как здесь.

РЕДАКТИРОВАТЬ: я обнаружил, что в моем случае переменная присваивается функцией rtems_interrupt_disable (на самом деле это макрос #defined), поэтому она не "не используется". Но назначенные значения, похоже, не используются. Я не знаю, используется ли этот синтаксис также и для подобных случаев (значение назначено, но не используется). Кстати, я обнаружил, что в дереве исходных текстов RTEMS есть функция (реальная функция, а не #defined) rtems_interrupt_disable, имеющая аргумент void, как показано ниже. (в cpukit / rtems / src / intrbody.c). (# Определенная версия находится в cpukit / rtems / include / rtems / rtems / intr.h)

rtems_interrupt_level rtems_interrupt_disable( void )
{       
  rtems_interrupt_level previous_level;

  _ISR_Disable( previous_level );

  return previous_level;
} 

Так что, возможно, этот синтаксис мог быть использован только в случае, если это второе определение (значение передается в функцию как void). Я думаю, потому что существует второе определение, которое можно использовать в некоторых случаях сборки.

1 ответ

Решение

Он ничего не делает.

Приведение имени переменной к (void) это распространенный способ сказать "выбросить это", все еще ссылаясь на именованную переменную.

Обычно это делается внутри функций, чтобы "использовать" аргументы, которые в противном случае вызвали бы предупреждение о неиспользованном аргументе или переменной.

В этом случае это выглядит ненужным и может быть следствием рефакторинга.

Я немного покопался в их публичном Git (я тоже не знаю RTEMS), но запустить blame кажется, не делая местного клона. Из рассмотрения головной версии файла становится ясно, что препроцессорных трюков вокруг рассматриваемого кода нет, он выглядит как кавычка.

Другие вопросы по тегам