Flat Leon Works

アプリやゲームを作ってます。

【C++】個別に未使用変数の警告を抑制する方法

未使用変数の警告

C++コンパイル時のオプションにより未使用変数の警告が出る場合があります。未使用変数というのはその名の通り、宣言したのに使っていない変数のことです。この未使用変数の警告が一番出やすいのは関数の仮引数の変数です。特に仮想関数では使用しない仮引数というのが現れがちです。この未使用変数の警告が邪魔くさい場合はコンパイラオプションで抑制することもできますが、そうもいかない場合や、一応未使用変数があることを知っておきたい場合は個別に未使用変数の警告を抑制する必要があります。というわけで、この記事では個別に未使用変数の警告を抑制する方法を紹介したいと思います。

※紹介する方法で警告が消えるかどうかはコンパイラによるかもしれません

方法1:仮引数をコメントアウトする

class Task
{
public:
    virtual void Update( float /*time*/ )
    {
    }
};

こうするとコンパイラは未使用変数の警告を出さなくなります。ただし、この方法は仮引数にしか使えません。

    virtual void Update( float )
    {
    }

このようにコメントアウトでなく、仮引数名をまるごと削除してしまっても良いのですが、コメントとして仮引数名を残しておいたほうがコードは読みやすくなると思います。

方法2:voidキャストを行う

void func( void )
{
    bool result = foo();
    (void)result;
}

この方法でも未使用変数の警告を抑制することができます。こちらは仮引数、変数どちらでも使えます。

(おまけ)方法3:voidキャストとコンマ演算子を使う

void func( void )
{
    if ( A* p_a = ((void)p_a,GetA()) )
    {
    }
}

これはvoidキャストの応用です。コンマ演算子を使うことで初期化式内で警告の抑制を行えます。コンマ演算子は、一番右側の式がコンマ演算子の評価結果になります。

こんな書き方しなくても素直に(void)p_a;でいいじゃないかと思われるかもしれませんが、これが便利な場面というのもあったりします。それはそのうち紹介したいと思います。

まとめ

どの方法がいいのかというと方法2のvoidキャストのやり方が一番良いのではないかと思います。仮引数、変数どちらにも使えますし、/**/によるコメントアウトはネストができないので、なるべく使いたくないというのもあります。