7

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 のソース ツリーに、以下のような void 引数を持つ関数 (実際の関数、#defined ではない) rtems_interrupt_disable があることを発見しました。(cpkit/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;
} 

したがって、この構文は、この 2 番目の定義 (値が void として関数に渡される) の場合に備えて使用された可能性があります。この2番目の定義が存在するため、一部のビルドケースで使用できると思います。

4

1 に答える 1

10

何もしていません。

変数名を にキャストすること(void)は、名前付き変数を参照しながら、「これを捨てる」と言う一般的な方法です。

未使用の引数または変数の警告をトリガーする引数を「使用」するために、通常は関数内で行われます。

この場合、不要に見え、リファクタリングの残留物である可能性があります。

彼らのパブリック Gitを少し調べてみましたが (RTEMS もわかりません) blame、ローカル クローンを作成せずに a を実行することはできないようです。ファイルの先頭バージョンを見ると、問題のコードを囲むプリプロセッサのトリックがないように見えます。引用されているように見えます。

于 2015-04-21T10:00:22.130 に答える