Betrachten Sie das folgende Beispiel:
%Vor% Da unsigned short
tatsächlich größer als 16 Bits sein kann, möchte ich den Wert vor snprintf
im Hex-Format auf einen Puffer fester Größe beschränken.
Allerdings gibt GCC (aber nicht clang) eine Warnung aus: comparison is always false due to limited range of data type [-Wtype-limits]
.
Ist das ein Fehler in GCC oder ich habe etwas übersehen? Ich verstehe, dass auf meiner Maschine unsigned short
genau 16 Bits ist, aber das ist nicht garantiert auf anderen Plattformen.
Ich würde sagen, es ist nicht ein Fehler. GCC behauptet, dass if (c > 0xfffful)
immer falsch ist, was auf Ihrem Rechner zutrifft. GCC war schlau genug, um dies zu erfassen, klang nicht. Gute Arbeit, GCC!
Auf der anderen Seite war GCC nicht schlau genug, um zu bemerken, dass, obwohl es auf Ihrer Maschine immer falsch war, es nicht unbedingt immer auf jemand anderem -Maschine falsch ist. Komm schon, GCC!
Beachten Sie, dass in C ++ 11 die *_least##_t
-Typen angezeigt werden (ich behalte mir das Recht vor falsch erwiesen!), um von typedef implementiert zu werden. Zu dem Zeitpunkt, zu dem GCC seine Warnung ausführt, hat es wahrscheinlich keine Ahnung, dass der ursprüngliche Datentyp uint_least16_t
war. Wenn dies der Fall ist, könnte der Compiler keine Schlussfolgerung ziehen, dass der Vergleich auf anderen Systemen zutrifft. Das Ändern von GCC, um sich daran zu erinnern, wie der ursprüngliche Datentyp war, könnte extrem schwierig sein. Ich verteidige nicht die naive Warnung des GCC, sondern schlage vor, warum es schwer zu beheben ist.
Ich wäre gespannt, was die GCC-Leute dazu sagen. Haben Sie darüber nachgedacht, ein Problem zu melden ?
Dies scheint nicht wie ein Fehler zu sein ( vielleicht könnte es als etwas naives Feature angesehen werden), aber ich sehe, warum Sie diesen Code für die Portabilität brauchen.
In Ermangelung von Standard-Makros, um Ihnen zu sagen, wie groß der Typ auf Ihrer Plattform ist (und es gibt keine), würde ich wahrscheinlich einen Schritt in meinem Build-Prozess haben, der das ausarbeitet und an ihn weitergibt Ihr Programm als -D
-Definition.
z.B. in Make:
%Vor%dann:
%Vor% mit der Makefile-Bedingung, die auf der Ausgabe von einem Schritt in configure
basiert, oder der Ausführung eines anderen C ++ - Programms, das einfach sizeof
s ausgibt. Leider schließt das Cross-Compiling aus.
Längerfristig schlage ich vor, den GCC-Leuten intelligenteres Verhalten vorzuschlagen, wenn diese speziellen Typ-Aliase verwendet werden.