Warum die hässlichen Keywords in C11?


15

Ich lese gerade einen Entwurf der C11-Spezifikation. Die neu eingeführten Schlüsselwörter: _Bool, _Alignof, _AtomicAlle 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_tin den Standard einschleichen!

Ist die Abwärtskompatibilität von nicht standardisiertem Code der einzige Grund für den neuen Stil der Schlüsselwörter?


2
Nein, ich würde mir keine Sorgen um so lange Typen machen. Die Anzahl der Buchstaben- und Zahlenkombinationen von _, az, AZ und 0-9 bedeutet, dass sie wahrscheinlich nur kurz und schwer zu merken sind.
Neil

2
Ein besser aussehendes Synonym für jedes Schlüsselwort wird häufig in der entsprechenden Standardbibliothek-Header-Datei definiert. Beispielsweise <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.
andrew.punnett

Antworten:


20

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.


Es sei darauf hingewiesen, dass die Frage in Bezug auf C nicht C ++ war, nicht dass es darauf ankommt. Ihre Antwort deckt den Grund ab, warum ein neuer unterstützter Typ so benannt wird, dass ein Konflikt mit einem benutzerdefinierten Typ Boolim Legacy-Code vermieden wird, der allgemein als boolescher, aber niemals als Teil des C-Standards anerkannt wurde, weshalb die Annahme nicht sicher ist machen.
Ramhound

1
@Ramhound, IMHO boolwä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.
Vorac

6
@Vorac: Das Problem ist, dass boolalle Projekte, die eine eigene (absolut legitime) Version von haben, boolnicht 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ür boolsich eine große Nachfrage bestand , wurde diese wie typedef _Bool boolin aufgenommen <stdbool.h>.
Bart van Ingen Schenau

1
@BartvanIngenSchenau - Mit dieser Option können Benutzer ihre eigene Typdefinition eines Booleschen Werts durch eine in ihr enthaltene Typdefinition ersetzen stdbool.hoder ihre eigene Typdefinition auf den neuen Typ aktualisieren, um ihren Legacy-Code zu unterstützen.
Ramhound

1
@Ramhound - Personen mit Variablen, die mit neuen C11-Schlüsselwörtern in Konflikt stehen, könnten auch "Also nicht verwenden?" Es gibt ein Kompilierungsflag std = xxx, um Konflikte mit neuen Sprachstandards zu vermeiden.
Scooter

8

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:

Ebenfalls für den Implementierer reserviert sind alle externen Bezeichner, die mit einem Unterstrich beginnen, und alle anderen Bezeichner, die mit einem Unterstrich beginnen, gefolgt von einem Großbuchstaben oder einem Unterstrich.

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.


4
Sie sollten den entsprechenden Abschnitt zu Standards zitieren und möglicherweise mit ihm verknüpfen oder ihn benennen, damit andere Ihre Aussage schnell überprüfen können. Dies wird Ihre Antwort verbessern.
SpaceTrucker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.