This question already has answers here:
What does (void) 'variable name' do at the beginning of a C function? [duplicate]

(2个答案)


6年前关闭。




在 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;行在做什么? (上面用//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 传递给函数)。我猜是因为存在第二个定义,可以在某些构建案例中使用它。

最佳答案

它什么都不做。

将变量名称转换为 (void) 是说“扔掉这个”的常用方法,同时仍然引用命名变量。

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

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

我在 their public Git 中挖掘了一些(我也不知道 RTEMS),但似乎不可能在不进行本地克隆的情况下运行 blame。从 the head version of the file 看起来很明显没有围绕相关代码的预处理器技巧,它显示为引用。

关于c - 仅在 C 中强制转换 (void) 的变量名的语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29768869/

10-10 08:59