在 C 中只有一个变量名转换为 (void) 的语句
statement with just a variable name casted (void) in 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;
行在做什么? (上面标有//<--)。它不是像 here.
中那样作为函数参数传入的变量
编辑:我发现在我的例子中变量是由rtems_interrupt_disable函数分配的(实际上它是一个宏#defined)所以它不是'not being used'。但是虽然分配了,分配的值似乎没有被使用。我不知道这种语法是否也用于这种情况(已分配但未使用的值)。顺便说一下,我在 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)
是 "throw this away" 的常见方式,同时仍然引用命名变量。
它通常在函数内部完成,"use" 个参数否则会触发未使用参数或变量的警告。
在这种情况下,它看起来没有必要,可能是重构的残留物。
我在 their public Git (I don't know RTEMS either) but it's not possible to run a blame
without doing a local clone, it seems. From looking at the head version of the file 中仔细研究了一下,似乎很明显有问题的代码周围没有预处理器技巧,它显示为引用。
在 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)所以它不是'not being used'。但是虽然分配了,分配的值似乎没有被使用。我不知道这种语法是否也用于这种情况(已分配但未使用的值)。顺便说一下,我在 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)
是 "throw this away" 的常见方式,同时仍然引用命名变量。
它通常在函数内部完成,"use" 个参数否则会触发未使用参数或变量的警告。
在这种情况下,它看起来没有必要,可能是重构的残留物。
我在 their public Git (I don't know RTEMS either) but it's not possible to run a blame
without doing a local clone, it seems. From looking at the head version of the file 中仔细研究了一下,似乎很明显有问题的代码周围没有预处理器技巧,它显示为引用。