2011-07-05 15 views
5

he el código siguiente y, al compilar con gcc-4.6 consigo la advertencia:Wunused-pero-set-variable de tratamiento advertencia

advertencia: 'status' Establecer variable pero no se utiliza [-Wunused- pero-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); 
} 

Cuando la bandera _DEBUG_ no se establece consigo la advertencia. ¿Alguna idea de cómo puedo solucionar esta advertencia?

Respuesta

3

Puede cambiar su ASSERT macro para:

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

Si la expresión no tiene efectos secundarios, entonces se debe todavía ser optimizado a cabo, sino que también debe suprimir la advertencia (si la expresión hace tienen cara -efectos, entonces obtendrías resultados diferentes en compilaciones de depuración y no depuración, ¡que tampoco deseas!).

+0

¿Qué quieres decir con efectos secundarios? – alnet

+1

@alnet: una expresión con efectos secundarios es aquella que cambia algo, por ejemplo, 'ASSERT (i ++);'. – caf

+0

Tengo un problema relacionado en este momento :) [link] (http://stackoverflow.com/questions/6641538/has-no-member-compilation-error) – alnet

1

Puede rodear la declaración de variable status con una cláusula #ifdef.

#ifdef _DEBUG_ 
    status_t status 
#endif 

EDIT: Hay que rodear la llamada también:

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

o puede apagar el mensaje de error.

2

La opción del compilador para desactivar las advertencias variables no utilizadas es -Wno-unused. para obtener el mismo efecto en un nivel más granular puede utilizar diagnostic pragmas así:

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

Esto es, por supuesto, no es portátil, pero se puede utilizar para something similar VS.

+0

Si fuera a hacer esto, simplemente podría usar la anotación '__attribute __ ((no utilizada))' en la declaración. – caf

Cuestiones relacionadas