c - 在 C 中只有一个变量名转换为 (void) 的语句

标签 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; 行在做什么? (上面标有//<--)。它不是像 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/

相关文章:

你可以使用用mingw编译的程序访问其他程序的内存吗?

c - 为什么在 IA32 堆栈过程中向后传递参数?

c - 为什么我们应该使用双指针在前/后添加节点,而不是在中间?

c++ - `Too many initializers` 用于 RTEMS 驱动程序定义中的阵列设置

c++ - 为以太网适配器设置自定义 ip 时无法绑定(bind)套接字

linux - rtem 中的编程与 Linux 中的编程有何不同?

c - 如何在 Linux 上创建 10MB 的二进制文件?

c - 在代码块窗口上使用 gcc 扩展

c - 如何获取库函数的内存位置?