visual studio instalar code bootstrap autocompletar visual-studio visual-studio-2010 visual-c++ compiler-warnings suppress-warnings

visual-studio - instalar - visual studio code html class intellisense



Visual Studio 2010(C++): suprima la advertencia C4706 temporalmente (5)

En lugar de tratar de ocultar su advertencia, solucione el problema por el que se queja ; su tarea tiene un valor (el valor en el lado izquierdo de la tarea) que puede usarse legalmente en otra expresión.

Puede solucionar esto probando explícitamente el resultado de la tarea:

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

Cuando compila el siguiente archivo fuente C ++ en Visual Studio 2010 con nivel de advertencia / W4 habilitado

#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"); } }

recibes la siguiente advertencia

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

para la línea 11.

Quiero suprimir esta advertencia exactamente en este lugar. Así que probé con 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 lo siguiente, esperando que esto solucione 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 ayudó.

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 nueva consulta: limpié la solución antes de cada compilación. Entonces probablemente esto no sea culpa.

Entonces, en conclusión: ¿cómo suprimo el C4706 exactamente en este lugar?

Edite 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?


La solución sensata es reescribir la condición para

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

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


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

Para los números de advertencia en el rango 4700-4999, que son los que están asociados con la generación de código, el estado de la advertencia vigente cuando el compilador encuentra la llave abierta de una función tendrá efecto para el resto de la función. El uso del pragma de advertencia en la función para cambiar el estado de una advertencia que tiene un número mayor que 4699 solo tendrá efecto una vez que finalice la función. El siguiente ejemplo muestra la ubicación correcta de los pragmas de advertencia para 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.

Por favor vea el siguiente código para 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"); } }


Hay una construcción simple !! para lanzar un tipo a bool . Me gusta esto:

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

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


Hay otra solución que evita la advertencia: el operador de coma .

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"); }