Ich habe versucht, eine C-Datei von Ссылка zu starten, aber ich Erhalten Sie Invalid suffix "-252" on integer constant
in diesem Teil des Codes:
Ich bin mir ziemlich sicher, dass es syntaxbezogen ist. Aber ich verstehe Code nicht wirklich (ich versuche es, aber ich stecke ziemlich fest). Kann mir jemand helfen?
ist eine hexadezimale Gleitkommakonstante in C und -252
ist der Exponententeil. Sie erhalten die Warnung, weil Sie ein Integer-Objekt mit einer Float-Konstante initialisieren.
ist ein ganzzahliger Ausdruck.
Verwenden Sie Letzteres, um das gewünschte Verhalten zu haben.
BEARBEITEN :
meine Antwort ist eigentlich nicht wahr. Während das Update in Ordnung ist, finden Sie in der Antwort von @MichaelBurr für die echte Erklärung dessen, was vor sich geht. 0x11E-252
wird als einzelnes Token unter C-Regeln gelesen und ist keine gültige Gleitkommazahl (oder Ganzzahl).
Dieses Problem hängt zwar mit hexadezimalen Gleitkommakonstanten zusammen, aber die Ursache des Problems liegt nicht darin, dass 0x11E
der Anfang einer hexadezimalen Gleitkommakonstante ist (weil es nicht der Anfang einer hexadezimalen Gleitkommakonstante ist). .
Das Problem ist, dass 0x11E-252
ein einzelnes Token anstelle von drei Token wie 0x11F-252
ist. Wenn Sie C99 6.4.8 "Preprocessing Numbers" betrachten, sehen Sie, dass ein pp-number Token ist:
Eine Vorverarbeitungsnummer beginnt mit einer Ziffer, der optional ein Punkt (.) vorangestellt ist, gefolgt von gültigen Identifizierungszeichen und den Zeichenfolgen e +, e-, E +, E-, p +, p-, P + oder P-.
Also ist 0x11E-252
ein einzelnes Token und Tokenisierung tritt in Übersetzungsphase 3 auf, aber wenn es Zeit ist, das Token syntaktisch und semantisch zu interpretieren (was in Übersetzungsphase 7 passiert), ist es nicht syntaktisch gültig, so dass Sie einen Compiler bekommen Fehler.
Andererseits sind 0x11F-252
drei Tokens, weil -
nicht Teil eines Tokens für die Anzahl der Vorläufe ist, es sei denn, es folgt unmittelbar ein P
oder E
(Groß- oder Kleinschreibung).
Natürlich hängt dies mit Gleitkomma-Konstanten zusammen (hexadezimal oder nicht), weil das -
-Zeichen in der Mitte eines Vorverarbeitungs-Nummern-Tokens liegen kann. Beachten Sie jedoch, dass Sie ähnliche Fehlermeldungen für Token wie 0xx11F
oder 22bad_token
erhalten, die keine Ähnlichkeit mit einer hexadezimalen Gleitkommakonstante haben.
Das Update ist wie ouah notiert , fügen Sie Whitespace vor dem -
ein, um den Compiler zu zwingen, die Sequenz als zu behandeln mehr als ein Token Wenn dies Ihr Code wäre, könnte eine noch bessere Lösung darin bestehen, all diesen magischen Zahlen (Enums oder Makros) Namen zu geben. Ein Bezeichner gefolgt von -
wird nicht als einzelnes Token betrachtet. Außerdem hätten Sie hoffentlich den Vorteil, dass der Code ein wenig selbstdokumentierter wird.