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 P
E
.
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.
¿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. –
@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 –
@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