2016-11-02 9 views
3

組み込みシステムでの周辺機器の要件では、レジスタを読み込む変数を宣言する必要がありますが、後でその値を使用することはありません。したがって、私は未使用の変数について自然にコンパイラの警告を受け取ります。 警告を抑制するにはどうすればよいですか?私は心の中で2つの方法がありますように、彼らは変数からダミーリードを追加 Cで未使用の変数のコンパイラ警告を抑制する方法は?

  • コンパイラに依存

  • ているので、私は躊躇し、コンパイラディレクティブを使用して

    1. を:あなたを

      volatile int var; 
      
      var = peripheral_register; 
      
      var = var; 
      

    います良いアイデアを持っている?

    +5

    伝統的に、この目的のために '(void)variable'を行います。 – fuz

    +0

    @FUZxxl:実際は正しい方法です。他の式でも警告が生成されることがあります(これについてのゴミコンパイラが不平を言うことは保証されず、他にもありません)。 – Olaf

    +1

    [Cの戻り値を無視する]の可能な複製(http://stackoverflow.com/questions/11888594/ignoring-return-values-in-c) – stdcall

    答えて

    4

    あなたがする必要があるすべては(例えば、いくつかのステータスフラグをクリアする)レジスタを読んでされている場合は、あなただけでは、すべての受信変数は必要ありません。

    (void)peripheral_register ; 
    

    は、レジスタを想定して十分である自身であります読み込みが必要なようにvolatile宣言されています。

    そうしないと、外部リンケージでダミーのvarをグローバルにすることができます。つまり、コンパイラはそれが他の場所では読み取られないと判断できません。それははるかに醜い解決策です。

    2

    はperipheral_registerが未使用の変数である場合にだけ 未使用(peripheral_register)のようなマクロを呼び出し

    #define unused(x) ((void)x) 
    

    ようにマクロを定義します。これにより、警告が削除されます。

    +0

    'void((x))'はCのエラーです。おそらく '((void)x)' –

    1

    変数です。 volatile変数を読むことは副作用です。

    コンパイラの警告が表示された場合は、コンパイラがC標準に準拠していないことを強く疑うでしょう。実際に読み込みが行われるように、コードに逆アセンブルする必要があります。もしそうでなければ、あなたのコンパイラは修復を超えて壊れています

    言い換えれば、(void)に式をキャストして、コンパイラの警告を黙らせることができます。たとえば、(void)var;です。しかし、この場合、あなたはそれをする必要はありません。

    関連する問題