2011-04-05 11 views
20

En el siguiente fragmento no se producen advertencias. g ++ 4.4.3 -Wall -pedanticg ++ -Wall no advierte sobre double-> int cast

//f is 
void f(int); 

f(3.14); 
double d = 3.14; 
int i = d+2; 

Tengo un fuerte recuerdo de que esto sea una advertencia, algo en la línea de "Posible pérdida de precisión". ¿Fue eliminado o mi memoria me está jugando un rol?

¿Cómo puedo convertir esto en una advertencia en g ++? Me parece una advertencia útil, ¿o es una mala idea?

ni siquiera puedo encontrar nada apropiado en http://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Warning-Options.html

Respuesta

24
$ gcc -Wconversion test.c 

test.c: In function ‘main’: 
test.c:3: warning: conversion to ‘int’ from ‘double’ may alter its value 
+3

Sí, esto hace el truco. Me parece realmente extraño que no esté incluido en -Wall. –

+1

Causa cientos de advertencias con conversiones relacionadas con enteros, y es por eso que no está habilitado en '-Wall'. Tal vez con https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53001 será más simple. – kwesolowski

20

opción Usar -Wconversion. -Wall no lo incluye.

Con -Wconversion opción, GCC da estos mensajes de advertencia:

advertencia: conversión a 'doble' valor constante 'int' altera
advertencia: conversión a 'int' de 'doble' puede alterar su valor

6

Aparte de lo que otras respuestas mencionar que es también vale la pena mencionar que en C++ 0x {} de inicialización no se estrecha. Así que en lugar de obtener una advertencia de que obtendrá un error, por ejemplo,

void f(int x) 
{ 
    // code 
} 

int main() 
{ 
    f({3.14}); // narrowing conversion of '3.14000000000000012434497875801753252744674682617e+0' from 'double' to 'int' inside { } 
} 

g++ 4.4 y por encima del soporte lista de inicialización (con opción -std=c++0x)

Cuestiones relacionadas