c++ - mundo - ¿Hace que el compilador VS atrape las asignaciones firmadas/no firmadas?
hola mundo c++ (3)
@quamrana:
Debe haber algo más allá de la opción / Wall para habilitar la advertencia 4365:
C:/Temp>cl /Wall /c foo.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
foo.c
foo.c(6) : warning C4018: ''<'' : signed/unsigned mismatch
Veo que Andrew lo hizo funcionar, pero ¿alguien tiene una idea de por qué no está funcionando aquí?
Los documentos de Visual Studio indican que debería, pero ni siquiera puedo obtener el programa de ejemplo en los documentos para dar la advertencia C4365 (aunque sí proporciona la advertencia C4245 relacionada, pero eso solo ocurre con una opción / W4).
El compilador de Visual Studio no parece advertir sobre las asignaciones firmadas / no firmadas, solo en las comparaciones. Por ejemplo, el siguiente código generará una advertencia en la sentencia if pero no en las asignaciones iniciales.
¿Hay alguna forma de hacerlo atrapar estos? Ya estoy en W4, pero pensé (esperaba) que podría haber otro entorno en algún lugar.
Gracias,
int foo(void)
{
unsigned int fooUnsigned = 0xffffffff;
int fooSigned = fooUnsigned; // no warning
if (fooSigned < fooUnsigned) // warning
{
return 0;
}
return fooSigned;
}
Actualizar:
Quamrana tiene razón, esto está controlado por la advertencia 4365 que parece estar desactivada por defecto, incluso en W4. Sin embargo, puede habilitarlo explícitamente para un nivel de advertencia dado como ese;
#pragma warning (4 : 4365)
Lo que resulta en;
warning C4365: ''initializing'' : conversion from ''unsigned int'' to ''int'', signed/unsigned mismatch
Debe habilitar la advertencia 4365 para atrapar la asignación.
Eso podría ser complicado: debe habilitar TODAS las advertencias, use / Wall, que permite muchas advertencias, por lo que puede tener problemas para ver la advertencia, pero lo hace.
Puede cambiar el nivel de cualquier advertencia específica usando / W [nivel] [código]. Entonces, en este caso, W34365 convertirá la advertencia 4365 en una advertencia de nivel 3. Si hace esto mucho, puede resultar útil colocar estas opciones en un archivo de texto y usar la opción @ [archivo] para simplificar la línea de comando.