12

Al compilar el siguiente fichero fuente en C++ en Visual Studio 2010 con el nivel de advertencia/W4 habilitadoVisual Studio 2010 (C++): suprimir C4706 advertencia temporalmente

#include <cstdio> // for printf 
#include <cstring> // for strcmp 

char str0[] = "Hello"; 
char str1[] = "World"; 

int main() 
{ 
    int result; 

    if (result = strcmp(str0, str1)) // line 11 
    { 
     printf("Strings are different\n"); 
    } 
} 

se obtiene la siguiente advertencia

advertencia C4706: asignación dentro de la expresión condicional

para la línea 11.

Quiero suprimir esta advertencia exactamente en este lugar. Así que traté de Google y encontré esta página: http://msdn.microsoft.com/en-us/library/2c8f766e(v=VS.100).aspx

así que cambió el código a la siguiente - esperando que esto resolvería el problema:

#include <cstdio> // for printf 
#include <cstring> // for strcmp 

char str0[] = "Hello"; 
char str1[] = "World"; 

int main() 
{ 
    int result; 

#pragma warning(push) 
#pragma warning(disable : 4706) 
    if (result = strcmp(str0, str1)) 
#pragma warning(pop) 
    { 
     printf("Strings are different\n"); 
    } 
} 

No sirvió de nada.

Esta variante tampoco ayudó:

#include <cstdio> // for printf 
#include <cstring> // for strcmp 

char str0[] = "Hello"; 
char str1[] = "World"; 

int main() 
{ 
    int result; 

#pragma warning(push) 
#pragma warning(disable : 4706) 
    if (result = strcmp(str0, str1)) 
    { 
#pragma warning(pop) 
     printf("Strings are different\n"); 
    } 
} 

Para evitar una investigación adicional: Limpié la solución antes de cada compilación. Entonces probablemente esto no sea culpa.

Por lo tanto, en conclusión: ¿cómo puedo suprimir el C4706 exactamente en este lugar?

Editar Sí, la reescritura es posible, pero realmente quiero saber por qué la forma en que trato de suprimir la advertencia (que está documentada oficialmente en MSDN) no funciona, ¿dónde está el error?

Respuesta

14

En MSDN Libray: http://msdn.microsoft.com/en-us/library/2c8f766e(v=VS.100).aspx, existe la sección de la siguiente manera.

Para los números de aviso en el rango de 4700-4999, que son los asociados con la generación de código, el estado de la advertencia en efecto cuando el compilador encuentra la llave de apertura de una función se en vigor para el resto de la función. Utilizando el pragma de advertencia en , la función para cambiar el estado de una advertencia que tiene un número más grande que 4699 solo tendrá efecto después del final de la función. El siguiente ejemplo de muestra la ubicación correcta de los pragmas de advertencia en deshabilitar un mensaje de advertencia de generación de código y luego restaurarlo.

Así que '#pragma warning' solo funciona para cada función/método.

Consulte el siguiente código para obtener más detalles.

#include <cstdio> // for printf 
#include <cstring> // for strcmp 

char str0[] = "Hello"; 
char str1[] = "World"; 

#pragma warning(push) 
#pragma warning(disable : 4706) 
void func() 
{ 
    int result; 
    if (result = strcmp(str0, str1)) // No warning 
    { 
     printf("Strings are different\n"); 
    } 
#pragma warning(pop) 
} 

int main() 
{ 
    int result; 

    if (result = strcmp(str0, str1)) // 4706 Warning. 
    { 
     printf("Strings are different\n"); 
    } 
} 
8

La solución sensata es volver a escribir la condición de

if((result = strcmp(str0, str1)) != 0) 

que informará cualquier compilador de C que realmente desea asignar, y es casi seguro para generar el mismo código objeto.

+2

mayoría de los compiladores implementar el "¿está seguro" factor por el que requiere un par adicional de soportes, deseo MSVC podría hacer lo mismo. – Thomas

19

En lugar de tratar de ocultar su advertencia, corrija the issue it's complaining about; su tarea tiene un valor (el valor en el lado izquierdo de la tarea) que puede usarse legalmente en otra expresión.

Puede solucionar este problema mediante la prueba de forma explícita el resultado de la misión:

if ((result = strcmp(str0, str1)) != 0) 
{ 
    printf("Strings are different\n"); 
} 
+0

No puedo creer que no haya pensado en eso. ¡Gracias! Def la mejor solución. –

1

hay una construcción sencilla !! para emitir un tipo de bool. De esta manera:

if (!!(result = strcmp(str0, str1))) 

Sin embargo, en algunos casos, la comparación directa != 0 podría ser más claro para el lector.

2

Hay otra solución que evita la advertencia: el comma operator.

La principal ventaja aquí será que no necesita paréntesis, por lo que es un poco más corto que la solución !=0 cuando el nombre de la variable es corto.

Por ejemplo:

if (result = strcmp(str0, str1), result) 
{ 
    printf("Strings are different\n"); 
}