13

範囲ベースの for ループでループ変数を「使用」しない方法はありますが、使用されていないというコンパイラの警告を回避する方法はありますか?

コンテキストについては、次のようなことをしようとしています。「警告をエラーとして扱う」を有効にしており、どこかで無意味に言及して変数を強制的に「使用」するようなハックはしたくありません。

size_t getSize(const std::forward_list &list)
{
  size_t count = 0;
  for (auto & : list) // compile error, but if i do "auto &i" here, MSVC
                      // complains (reasonably) that i is unused
  {
    ++count;
  }
  return count;
}

これを行うには他の方法があることは知っていますが、議論のために、範囲ベースの for ループを使用する必要があるとしましょう。

4

5 に答える 5

6

マクロを定義できます。

#if defined(__GNUC__)
#  define UNUSED __attribute__ ((unused))
#elif defined(_MSC_VER)
#  define UNUSED __pragma(warning(suppress:4100))
#else
#  define UNUSED
#endif

...
for (auto &dummy UNUSED : list)
{
  ++count;
}
...

GCCとCLANGでうまく機能します(MSVCについてはよくわかりません... MSVCがファイルの残りの警告を無効にすることを覚えているようです)。

また:

template<class T> void unused(const T &) {}
...
for (auto &dummy : list)
{
  unused(dummy);

  ++count;
}
...

すべてのコンパイラで動作し、オーバーヘッドはありません (メールバッグ: コンパイラの警告をシャットダウンします)。

Boost ヘッダー<boost/core/ignore_unused.hpp>(Boost >= 1.56) は、同じ目的で関数 template を定義しますboost::ignore_unused()

C++11 もstd::ignore良い選択です:

{
  std::ignore = dummy;
  // ...
}

同様の質問:


PS C++17は、未使用の変数を宣言する標準的な方法を提供する属性を取得しているようです。[[maybe_unused]]

于 2014-02-15T16:10:09.877 に答える