只有一个变量名的语句在C中输入(void)

时间:2015-04-21 09:57:43

标签: c rtems

在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;行在做什么? (标有//&lt; - 上面)。它不是像here中那样作为函数参数传入的变量。

编辑:我发现在我的情况下,变量是由rtems_interrupt_disable函数分配的(实际上它是一个宏#defined)所以它不是“没有被使用”。但是虽然已分配,但似乎未使用指定的值。我不知道这种语法是否也用于这种情况(值已分配但未使用)。顺便说一句,我发现在RTEMS源代码树中有一个函数(实函数,而不是#defined)rtems_interrupt_disable,如下所示具有void参数。 (在cpukit / rtems / src / intrbody.c中)。 (#defined版本在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 个答案:

答案 0 :(得分:10)

它没有做任何事情。

将变量名称转换为(void)是一种常见的方式来说“扔掉它”,同时仍然引用命名变量。

它通常在函数内部完成,以“使用”参数,否则会触发对未使用的参数或变量的警告。

在这种情况下,它看起来没必要,可能是重构的残留。

我在their public Git中挖了一下(我也不知道RTEMS),但似乎不能在没有做本地克隆的情况下运行blame。通过查看the head version of the file,似乎很清楚,相关代码周围没有预处理器技巧,它显示为引用。