Warum hat gcc lange eine Warnung?

Lesezeit: 3 Minuten

Patricks Benutzeravatar
Patrick

Was ist der Grund für die -Wlong-long gcc-Warnung?

Aus der gcc-Manpage:

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

So wie ich es verstehe, long long muss mindestens 64-Bit sein (praktisch immer 64-Bit, zumindest bei heutigen Compilern). War dies bei ISO C90 oder C++98 nicht der Fall, oder gibt es einen anderen Grund, es nicht zu verwenden? long long?

ich weiss Bescheid <stdint.h> Typen wie int64_t und Freunde, aber einige nicht so alte Compiler (z. B. VS2005 und Green Hills ARM 3.5) bieten dies nicht <stdint.h>und ich dachte long long wären (mindestens) 64 Bit für diese und neuere Toolchains.

  • Compiler, die das nicht haben stdint.h sind nicht C99-konform, was bedeutet, dass es gute Chancen gibt, die sie nicht haben long long überhaupt! (Es sei denn, es handelt sich um alte Versionen von GCC.)

    – zol

    21. Juli 2016 um 15:37 Uhr


  • Aus der gegebenen Beschreibung geht hervor, dass Patricks “nicht so alte” Compiler in der gleichen Kategorie wie ein gcc aus den 90ern liegen – long long ohne stdint.h (außer dass wir die meiste Zeit der 90er Jahre die Entschuldigung hatten, dass C99 noch nicht geschrieben wurde, plus die Entschuldigung, dass “normale” CPUs keine 64-Bit-Ganzzahlregister hatten, also das Fehlen einer 64-Bit-Ganzzahl unter den grundlegenden C-Typen machten Sinn.)

    Benutzer2404501

    21. Juli 2016 um 16:00 Uhr

  • @WumpusQ.Wumbley: C wurde entwickelt, um auf 8-Bit-Prozessoren verwendet werden zu können (und wurde in den 1980er Jahren tatsächlich häufig verwendet). Lange Additionen in vier Schritten durchführen zu müssen, war etwas lästig, aber selbst wenn bekannt war, dass Zahlen nicht größer als 16777215 waren, war die Bequemlichkeit, mit einer einzigen Größe arbeiten zu können, den Leistungsverlust durch die Verwendung von vier statt drei Schritten wert. Es gibt weitaus weniger Fälle, in denen die Verwendung eines 8-Byte-Typs gerechtfertigt wäre. IMHO wäre es das richtige Mittel gewesen, “Long Long” zu einem optionalen Feature zu machen, zumindest für freistehende Implementierungen.

    – Superkatze

    7. September 2016 um 21:16 Uhr

Benutzeravatar von a3f
a3f

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

GCC hat es jedoch vor der Standardisierung als Erweiterung bereitgestellt.

  • …ein seltenes Beispiel einer gcc-Erweiterung, die mit derselben Semantik standardisiert wurde

    Benutzer2404501

    21. Juli 2016 um 15:15 Uhr

  • Der Grund für eine solche Warnung scheint also darin zu bestehen, sicherzustellen, dass Ihr Code mit nicht C99- oder C++-11-kompatiblen Compilern kompiliert wird.

    – Patrick

    21. Juli 2016 um 15:48 Uhr

  • @Patrick ja, und ich denke, die Option existiert nur, weil jemand entschieden hat, dass alle Warnungen aktiviert werden -ansi -pedantic sollten selbst vertreten sein -Wfoo Optionen. Es gibt wirklich keinen Grund zu verwenden -Wlong-long von allein. Oh doch -Wno-long-long macht mehr Sinn.

    Benutzer2404501

    21. Juli 2016 um 16:04 Uhr


  • @Patrick: Ein weiterer Grund für eine solche Warnung für Dezimalliterale, die zufällig zwischen LNG_MAX + 1u und ULNG_MAX liegen, ist, dass solche Literale in C89 als vorzeichenlose Typen, in C99 jedoch als vorzeichenbehaftete Typen angesehen werden. In C89-Implementierungen, in denen LNG_MAX 2147483647 und ULNG_MAX 4294967295 ist, ist der Ausdruck 4294967295==-1 würde 1 ergeben (da beide Seiten konvertiert würden in unsigned long), während es in C99 zu 0 ausgewertet würde (beide Seiten konvertiert in unsigned long long).

    – Superkatze

    5. November 2016 um 23:02 Uhr

  • @Galaxy lang lang ist mindestens 64-bisschen aber. 😉

    – a3f

    9. Juli 2018 um 5:49 Uhr

1386790cookie-checkWarum hat gcc lange eine Warnung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy