Podczas gdy ten problem jest związany ze stałymi zmiennoprzecinkowymi stałymi, podstawowa przyczyna problemu nie leży w tym, że 0x11E
jest początkiem stałej zmiennoprzecinkowej (ponieważ nie jest to początek stałej pływającej w kształcie szesnastkowym). Jest to jeden token zamiast trzech tokenów, takich jak 0x11F-252
. Jeśli spojrzeć na C99 6.4.8 „przetw numery”, zobaczysz, że pp numer tokena jest: (.)
Szereg przerób zaczyna się od cyfry ewentualnie poprzedzone okresem i może być stosowana przez poprawnych znaków identyfikacyjnych oraz znaków sekwencje e +, e-, E + E, P +, P-, P + lub P-
Więc 0x11E-252
jest jeden żeton i tokenizing występuje w fazie translacji 3, ale kiedy przychodzi czas na interpretację tokenu składniowo i semantycznie (co dzieje się w fazie tłumaczenia 7), nie jest to poprawne pod względem syntaktycznym, więc pojawia się błąd kompilatora.
Z drugiej strony, 0x11F-252
jest trzy żetony ponieważ -
nie jest częścią numeru przerób tokena o ile nie zostanie natychmiast poprzedzony P
lub E
(górna lub małymi literami).
Oczywiście jest to związane ze stałymi zmiennoprzecinkowymi (szesnastkowymi lub innymi), dlatego znak -
może znaleźć się w środku znacznika numeru preprocessingu. Należy jednak zauważyć, że otrzymają podobne komunikaty o błędach dla tokenów takich jak 0xx11F
lub 22bad_token
, które nie przypominają stałej stałej zmiennoprzecinkowej.
Poprawka ma postać as ouah noted, należy wstawić spację przed numerem -
, aby zmusić kompilator do traktowania sekwencji jako więcej niż jeden token. Jeśli to był twój kod, lepszym rozwiązaniem może być podanie nazw wszystkich magicznych liczb (wyliczeń lub makr). Identyfikator, po którym następuje -
, nie będzie traktowany jako pojedynczy token.Plus masz nadzieję, że zyskasz premię, dzięki której kod będzie trochę bardziej samoprzylepny.
Z jakiego kompilatora korzystasz? Jest to błąd kompilatora, który był obecny w gcc 2.95, może na początku gcc 3.x i być może innych kompilatorach. –
@R. - ten błąd występuje dla mnie z całkiem niedawnym gcc 4.6.1 - jest błąd zamknięty jako "RESOLVED INVALID": http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3885 Istnieje otwarty błąd śledzący uczynienie diagnostyki bardziej przyjaznym: http://gc.gnu.org/bugzilla/show_bug.cgi?id=24976 –
@R ..: Używam Qt Framework, więc domyślam się, że używam kompilatora GCC? Ten sam błąd wystąpił w systemach Windows (MingW) i Linux (zmodyfikowany w celu użycia pcsc-lite) (gcc 4.5.2) – amree