6

次のコードがあり、gcc-4.6 でコンパイルしているときに警告が表示されます。

警告: 変数 'status' が設定されていますが、使用されていません [-Wunused-but-set-variable]

#if defined (_DEBUG_)
#define ASSERT       assert
#else                           /* _DEBUG_ */
#define ASSERT( __exp__ )
#endif   

static inline void cl_plock(cl_plock_t * const p_lock)
{
        status_t status;
        ASSERT(p_lock);
        ASSERT(p_lock->state == INITIALIZED);

        status = pthread_rwlock_unlock(&p_lock->lock);
        ASSERT(status == 0); 
}

_DEBUG_ フラグが設定されていない場合、警告が表示されます。この警告を回避するにはどうすればよいですか?

4

3 に答える 3

3

ASSERTマクロを次のように変更できます。

#if defined (_DEBUG_)
#define ASSERT       assert
#else                           /* _DEBUG_ */
#define ASSERT( exp ) ((void)(exp))
#endif   

式に副作用がない場合でも最適化する必要がありますが、警告も抑制する必要があります (式に副作用がある場合、デバッグ ビルドと非デバッグ ビルドで異なる結果が得られますが、これはありません)。どちらも必要ありません!)。

于 2011-07-06T06:24:28.473 に答える
2

未使用の変数の警告をオフにするコンパイラ オプションは-Wno-unused. より詳細なレベルで同じ効果を得るには、次のような診断プラグマを使用できます。

int main()
{
  #pragma GCC diagnostic ignored "-Wunused-variable"
  int a;
  #pragma GCC diagnostic pop
  // -Wunused-variable is on again
  return 0;
}

もちろん、これは移植可能ではありませんが、VS にも同様のものを使用できます。

于 2011-07-05T13:27:59.623 に答える
1

statusの変数宣言を#ifdef句で囲むことができます。

#ifdef _DEBUG_
    status_t status
#endif

編集:呼び出しも囲む必要があります:

#ifdef _DEBUG_
    status = pthread_rwlock_unlock(&p_lock->lock);
#else
    pthread_rwlock_unlock(&p_lock->lock);
#endif

または、エラー メッセージをオフにすることができます。

于 2011-07-05T13:19:55.867 に答える