2012-08-15 23 views
8

que he estado tratando de ejecutar un archivo de C https://github.com/amree/mykad-c/blob/master/scdump.c, pero me siguen dando Invalid suffix "-252" on integer constant en esta parte del código:sufijo válido "-252" en la constante entera

 if (RxBuffer[0x11E-252] == 'P') 
      printf("Female\n"); 
     else if (RxBuffer[0x11E-252] == 'L') 
      printf("Male\n"); 
     else 
      printf("%c\n", RxBuffer[0x11E-252]); 

Estoy bastante seguro de que es sintaxis relacionada. Pero realmente no entiendo el código (lo intento, pero estoy bastante atascado). ¿Alguien puede ayudarme?

+0

¿Qué compilador estás usando? Este es un error del compilador que estaba presente en gcc 2.95, quizás en los primeros gcc 3.x, y tal vez en otros compiladores. –

+0

@R. - Este error ocurre para mí con un gcc 4.6.1 bastante reciente - hay un error cerrado como "RESOLVED INVALID": http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3885 Hay un error abierto que está rastreando haciendo que el diagnóstico sea más amigable: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24976 –

+0

@R ..: Estoy usando Qt Framework, ¿así que supongo que estoy usando el compilador GCC? Obtuve el mismo error en Windows (MingW) y Linux (modificado para usar pcsc-lite) (gcc 4.5.2) – amree

Respuesta

5
0x11E-252 

es un punto flotante hexadecimal constante en C y -252 es la parte exponente. Obtiene la advertencia porque está inicializando un objeto entero con una constante de flotación.

0x11E - 252 // Note the whitespace 

es una expresión entera.

Utilice este último para tener el comportamiento deseado.

EDITAR:

mi respuesta no es realmente cierto. Si bien la solución está bien, consulte la respuesta en @MichaelBurr para obtener una explicación real de lo que está sucediendo. 0x11E-252 es una lectura como un token único bajo reglas C y no es un número válido flotante (o entero).

+1

Esto no es una advertencia, es un error, porque las constantes hexadecimales FP usan 'p' en lugar de' e' (ya que 'e' es un dígito hexadecimal válido). Aquí hay un [link] (http://stackoverflow.com/a/4825867/335858) que explica las constantes de flotación hexadecimales de C99. – dasblinkenlight

+0

Bueno, quise decir advertencia en el sentido de C de diagnóstico. – ouah

+0

Ah, ya veo. Buena respuesta, por cierto (+1). – dasblinkenlight

10

Si bien este problema está relacionado de una manera con las constantes de punto flotante hexadecimales, la causa raíz del problema no es porque 0x11E es el inicio de una constante de flotación hexadecimal (porque no es el inicio de una constante flotante hexadecimal).

El problema es que 0x11E-252 es un token único en lugar de tres tokens como 0x11F-252 es. Si nos fijamos en C99 6.4.8 "números Preprocesamiento", verá que un token-pp número es: (.) ​​

Un número pre-procesamiento comienza con un dígito opcionalmente precedido por un período que puede ir seguida por caracteres identificador válido y el carácter secuencias de e +, E-, e +, E-, p +, p-, P + o P-

Así, 0x11E-252 es un solo token y tokenizing se produce en fase de traducción 3, pero cuando llega el momento de interpretar el token sintáctica y semánticamente (lo que sucede en la fase de traducción 7), no es sintácticamente válido, por lo que se obtiene un error de compilación.

Por otro lado, es 0x11F-252 tres fichas porque el - no es parte de un token número de pre-procesamiento a menos que sea inmediatamente precedida por una (en minúsculas o superior) o PE.

Por supuesto, esto está relacionado con las constantes flotantes (hexadecimales u otras) porque es por eso que el carácter - puede terminar en el medio de un token de número de preprocesamiento. Sin embargo, tenga en cuenta que obtendrá un mensaje de error similar para tokens como 0xx11F o 22bad_token que no se parecen a una constante de punto flotante hex.

La corrección es as ouah noted, inserte espacios en blanco antes del - para forzar al compilador a tratar la secuencia como más de un token. Si este fuera tu código, una solución aún mejor podría ser dar nombres a todos esos números mágicos (enums o macros). Un identificador seguido de - no se considerará un solo token.Además, es de esperar que tenga la ventaja de hacer que el código sea un poco más auto documentado.

+0

Consulte al final de http://gcc.gnu.org/onlinedocs/gcc/Incompatibilities.html la documentación explícita de GCC sobre este tema. –