Ich lese gerade einen Entwurf der C11-Spezifikation. Die neu eingeführten Schlüsselwörter: _Bool, _Alignof, _Atomic
Alle fühlen sich wie benutzerdefinierte Erweiterungen an, anstatt wie Standardschlüsselwörter struct, union, int
.
Mir ist klar, dass der Standard im Wesentlichen aus standardisierten Erweiterungen besteht ... aber das ist schrecklich! Vielleicht werden wir uns bald __Long_Long_Reallylong_Integer_MSVC_2020_t
in den Standard einschleichen!
Ist die Abwärtskompatibilität von nicht standardisiertem Code der einzige Grund für den neuen Stil der Schlüsselwörter?
<stdbool.h>
muss die Header-Datei einer C11-Implementierung ein Präprozessor-Makro enthalten, z#define bool _Bool
. Dies ist eine saubere Lösung, da sie die Abwärtskompatibilität beibehält, es jedoch jedem neuen Code, der die neue Header-Datei enthält, ermöglicht, die attraktivere Syntax zu verwenden.Antworten:
Ich stelle mir vor, dass die Abwärtskompatibilität mit perfektem Standardcode ein wichtigerer Grund ist.
Wenn Sie ein Schlüsselwort hinzufügen, das möglicherweise im vorherigen Code als legitimer Bezeichner verwendet wurde, entsteht eine Menge Schmerz, möglicherweise subtiler Fehler, insbesondere in C, einer Sprache mit irgendwie komplizierten Analyseregeln.
Wenn diese Bezeichner irgendwo als öffentliche Schnittstelle verwendet würden, würden Sie allen Benutzern derart unglücklicher Bibliotheken, die möglicherweise kein C verwenden, sondern die Bibliothek von Ruby oder Python usw. aus aufrufen, Schmerzen bereiten.
Aus diesem Grund sehen neue Keywords weniger nach netten Worten aus, sondern eher nach Bolt-On-Hacks, die Menschen mit geringerer Wahrscheinlichkeit bereits für einen anderen Zweck verwenden.
quelle
Bool
im Legacy-Code vermieden wird, der allgemein als boolescher, aber niemals als Teil des C-Standards anerkannt wurde, weshalb die Annahme nicht sicher ist machen.bool
wäre eher im Sinne von C. Auch ich bin von dieser Antwort nicht ganz überzeugt, da hässliche Wörter möglicherweise auch von nicht standardisiertem Code verwendet wurden. Wenn Sie den Stil der Wörter ändern, werden Standardwörter auf einen Blick schwerer zu erkennen.bool
alle Projekte, die eine eigene (absolut legitime) Version von haben,bool
nicht mehr kompiliert werden , wenn sie bedingungslos zur Sprache hinzugefügt werden . Dies würde die Akzeptanz der Sprachrevision ernsthaft beeinträchtigen. Aus diesem Grund werden alle neuen Bezeichner aus dem reservierten Satz (also beginnend mit_[capital]
) übernommen. Da auch fürbool
sich eine große Nachfrage bestand , wurde diese wietypedef _Bool bool
in aufgenommen<stdbool.h>
.stdbool.h
oder ihre eigene Typdefinition auf den neuen Typ aktualisieren, um ihren Legacy-Code zu unterstützen.Namen, die mit einem Unterstrich und einem Großbuchstaben beginnen (und alle mit einem doppelten Unterstrich), waren in früheren Standards für die Implementierung der Compiler- / Standardbibliothek reserviert.
Aus reservierten Bezeichnern von C89 und C99:
Theoretisch sollten diese neuen Schlüsselwörter in keinem zuvor geschriebenen Code verwendet werden. Dies führt zu einer besseren Abwärtskompatibilität als ein einfacher Name, was wahrscheinlich der einzige Grund ist.
quelle