2016-07-21 22 views
28

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.

+0

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

+0

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.) –

+0

@ 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

Antwort

32

Es gab noch keinen long long Typ in ISO C90 und C++ 98. Es wurde nur in ISO C99 und C++ 11 hinzugefügt.

GCC stellte es jedoch als eine Erweiterung vor der Standardisierung zur Verfügung.

+19

... ein seltenes Beispiel für eine gcc-Erweiterung, die mit der gleichen Semantik standardisiert wurde –

+0

Der Grund für eine solche Warnung scheint zu sein, sicherzustellen, dass Ihr Code mit nicht C99- oder C++ - 11-kompatiblen Compilern kompiliert. – Patrick

+6

@Patrick ja, und ich denke, die Option existiert nur, weil jemand entschieden hat, dass alle Warnungen, die durch '-ansi -pedantic' aktiviert werden, durch ihre eigenen 'Wfoo'-Optionen repräsentiert werden sollten. Es gibt wirklich keinen Grund, "-lang-lang" alleine zu verwenden. Oh, aber '-Wo-lang-lang' macht mehr Sinn. –