Estaba jugueteando con GCC 4.9.2 en Windows y noté que no advierte sobre la conversión de doble a int, mientras que el compilador de Visual Studio sí lo hace:
El código:
int main() { int celsius, fahrenheit, kelvin; celsius = 21; fahrenheit = celsius * 9 / 5 + 32; kelvin = celsius + 273.15; //here it should warn! printf("%d C = %d F = %d K", celsius, fahrenheit, kelvin); return 0; }Compilé usando:
gcc hello.c -Wall -Wextra -pedantic -std=c99Compilé el mismo código con el compilador de Visual Studio:
C:\temp>cl hello.c /nologo /W4 /FeC2f.exe hello.c hello.c(14): warning C4244: '=': conversion from 'double' to 'int', possible loss of data¿Qué estoy haciendo mal?
Debe usar el indicador -Wconversion , con eso gcc advierte:
warning: conversion to 'int' from 'double' may alter its value [-Wconversion] kelvin = celsius + 273.15; //here it should warn! ¿Por qué no está habilitado con -Wall o -Wextra Está cubierto en el wiki vinculado que dice:
Las conversiones implícitas son muy comunes en C. Esto, junto con el hecho de que no hay flujo de datos en los front-ends (consulte la siguiente pregunta), da como resultado advertencias difíciles de evitar para un código válido y que funcione perfectamente. Wconversion está diseñado para un nicho de usos (auditorías de seguridad, portar código de 32 bits a 64 bits, etc.) donde el programador está dispuesto a aceptar y solucionar advertencias no válidas. Por lo tanto, no debe habilitarse si no se solicita explícitamente.