Wunused-но-переменная обработка предупреждения

У меня есть следующий код, и при компиляции его с помощью 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_ не установлен, я получаю предупреждение. Любые идеи, как я могу обойти это предупреждение?

3 ответа

Решение

Вы можете изменить свой ASSERT макрос для:

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

Если выражение не имеет побочных эффектов, оно все равно должно быть оптимизировано, но оно также должно подавлять предупреждение (если выражение имеет побочные эффекты, вы получите разные результаты в отладочных и не отладочных сборках, которые вы не ' тоже не хочу!)

Опция компилятора для отключения неиспользуемых переменных предупреждений -Wno-unused, Чтобы получить тот же эффект на более детальном уровне, вы можете использовать диагностические прагмы, например:

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

Это, конечно, не переносимо, но вы можете использовать нечто подобное для VS.

Вы можете окружить объявление переменной 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

или вы можете отключить сообщение об ошибке.

Другие вопросы по тегам