Was ist der Grund für die -Wlong-long
gcc Warnung?Warum hat gcc lange eine Warnung?
Von der gcc-man-Seite:
-Wlong-long
Warn if long long type is used. This is enabled by either -Wpedantic or -Wtraditional in ISO C90 and C++98 modes. To inhibit the warning messages, use -Wno-long-long.
Wie ich es verstehe, long long
erforderlich ist, mindestens 64-Bit (praktisch ist es immer 64-Bit, zumindest mit dem heutigen Compiler). War das bei ISO C90 oder C++ 98 nicht der Fall, oder gibt es einen anderen Grund, long long
nicht zu verwenden?
Ich weiß über <stdint.h>
Typen wie int64_t
und Freunde, aber einige nicht so alten Compiler (zB VS2005 und Green Hills ARM 3.5) bieten nicht <stdint.h>
, und ich dachte long long
würde (zumindest) sein 64-Bits für diese und neuere Toolchains.
Compiler, die nicht über 'stdint.h' verfügen, sind nicht C99-konform, was bedeutet, dass es gute Chancen gibt, dass sie überhaupt nicht 'lang' haben! (Es sei denn, sie sind alte Versionen von GCC.) – zwol
Aus der Beschreibung klingt es wie Patricks "nicht-so-alte" Compiler sind in der gleichen Kategorie wie ein 90er GCC - 'Long Long' ohne' stdint.h' (außer dass wir in den 90ern die Entschuldigung hatten, dass C99 noch nicht geschrieben wurde, plus die Entschuldigung, dass "normale" CPUs keine 64-Bit-Integer-Register hatten, also das Fehlen einer 64-Bit-Integer unter den grundlegenden C-Typen hat einen Sinn gemacht.) –
@ WumpusQ.Wumbley: C wurde entwickelt, um verwendbar zu sein (und in den 1980er Jahren wurde tatsächlich oft verwendet) auf 8-Bit-Prozessoren; die Durchführung langer Additionen in vier Schritten war etwas mühsam, aber selbst wenn Zahlen nicht größer als 16777215 waren, war die Annehmlichkeit, mit einer einzigen Menge arbeiten zu können, den Leistungsverlust von vier statt drei Schritten wert. Es gibt viel weniger Fälle, in denen die Verwendung eines 8-Byte-Typs gerechtfertigt wäre. Meiner Meinung nach wäre das richtige Mittel gewesen, "long long" zu einem optionalen Feature zu machen, zumindest für freistehende Implementierungen. – supercat