Was ist der Verlauf für das Benennen von Konstanten in Großbuchstaben?

20

Was ist die Geschichte hinter der Konvention, Konstanten in Großbuchstaben zu benennen?

Meine Intuition ist, dass es mit dem C-Präprozessor begann, bei dem die Leute eine Methode entwickelt haben, Präprozessor-Makros in Großbuchstaben zu benennen, damit sie effektiv in einem separaten Namespace leben und Namenskollisionen vermeiden. Meiner Meinung nach wurde diese Praxis damals missverstanden und missachtet, um sie auch auf Nicht-Präprozessor-Konstanten ( enums, constVariablen) anzuwenden .

Das Benennen von Präprozessor-Makros in Großbuchstaben erscheint mir wirklich nützlich. Allgemeine Konstanten so benennen, nicht so sehr (und kontraproduktiv, wenn Kollisionen mit Makronamen entstehen).

Bin ich nicht auf der Basis? Hat die Praxis der Großschreibung von Konstanten vor C begonnen?

jamesdlin
quelle
3
Ich denke, Sie sind hier richtig. Frühe Sprachen hatten so ziemlich alles in Großbuchstaben, wobei die Verwendung von Kleinbuchstaben später in Mode kam. Frühe C-Bücher scheinen typischerweise constBezeichner in Kleinbuchstaben und #definesin Großbuchstaben zu zeigen. Java, obwohl Großbuchstaben für Konstanten und andere Sprachen übernommen, folgte, aber ich könnte das letzte bisschen falsch haben. Mehr Forschung nötig! :)
David Arno
Ich stimme mit @DavidArno überein, wahrscheinlich aufgrund der Art von C oder Assembler.
Snoop

Antworten:

13

Für C deutet die erste Ausgabe von The C Programming Language (auch bekannt als K & R) darauf hin, dass Ihre Intuition in Bezug auf Präprozessor-Makros richtig ist:

Namen von symbolischen Konstanten werden üblicherweise in Großbuchstaben geschrieben, damit sie leicht von Variablennamen in Kleinbuchstaben unterschieden werden können.

In vielerlei Hinsicht war dies ein Überbleibsel der Assemblersprache, in der Makros zusammen mit Beschriftungen, Opcodes, Registernamen und allem anderen in Großbuchstaben definiert wurden. Das Aufkommen der AT & T-artigen Assemblierung änderte dies auf einigen Plattformen, aber ich denke, es wurde stark von der Tatsache beeinflusst, dass Terminals, die Kleinbuchstaben unterstützen, zu einer Sache wurden und Unix das war, was ich als "Kleinbuchstaben-Betriebssystem" bezeichnen würde.

Bei den anderen beiden Punkten schlagen Sie mit 500:

Enum

Als die zweite Ausgabe veröffentlicht wurde enum, wurden sie als Aufzählungskonstanten bezeichnet und im Abschnitt über Konstanten behandelt. Da die durch a definierten Konstanten enumdurch Symbole dargestellt werden, handelt es sich um symbolische Konstanten, die, wenn Sie der empfohlenen Konvention folgen, in Großbuchstaben angegeben werden sollten. (Wie bei Präprozessor-Makros hindert Sie nichts daran, etwas anderes zu tun.)

Dies impliziert, dass C anders als einige der folgenden Sprachen keinen enumerstklassigen Typ behandelt, bei dem die Typen selbst unterschiedlich sind. Die Aufzählungswerte sind für jeden Typ spezifisch und können in anderen wiederverwendet werden. Stattdessen ist es praktisch eine Abkürzung #define, die Folgen von ganzen Zahlen mit angehängten Bezeichnern erzeugt. Das macht

enum foo  { BAR, BAZ };
enum quux { BLETCH, BAZ };

ungültig, da alle Symbole den Gültigkeitsbereich teilen und BAZneu definiert werden. (Dies war eine Verbesserung gegenüber dem Präprozessor, der zu der Zeit nicht davor gewarnt hat, dass ein #defineProzessor einen anderen stört.) Außerdem ist es C egal, ob Sie sie mischen, weil sie alle nur Ganzzahlen sind, die erzeugen

enum foo  { BAR, BAZ };
enum quux { BLETCH, BLRFL };

enum foo variable = BLETCH;

Dies gilt auch für einen modernen Compiler, bei dem alle Warnungen aktiviert sind.

Const

NB: Das constSchlüsselwort entstand im Jahr 1981 mit Stroustrup C mit Klassen (die in C entwickelt ++) und wurde schließlich von C. Die Wahl des Namens angenommen bedauerlich ist, weil es mit K & R Verwendung des Begriffs kollidiert konstant zu meinen , was wir würden ein jetzt nennen literal ( zum Beispiel 38, 'x'oder "squabble"). Der Text in der zweiten Ausgabe wurde nicht umgeschrieben, um dies widerzuspiegeln.

Deklarierte Variablen constsind eine andere Geschichte, weil sie immer noch Variablen sind. Sie sollten nicht modifiziert werden, aber ob der Begriff einer konstanten Variablen sinnvoller ist, als zum Beispiel Jumbo-Shrimps, ist Futter für eine weitere Diskussion. Wie dem auch sei, C hat es nie wirklich ernst genommen, da der Standard nur verlangt, dass der Compiler eine Diagnose ausgibt, wenn Sie versuchen, eine zu ändern. Das tatsächliche Verhalten ist undefiniert, wenn eine Änderung kompiliert und ausgeführt wird.

Da es sich um Variablen handelt, ist es sinnvoll, dass alles constder Konvention folgt, dass Kleinbuchstaben verwendet werden. Die Verwendung zur Darstellung von Literalen bietet einige Sicherheitsvorteile, ist jedoch keine gute Optimierung, wenn Sie zwischen Kompilierungseinheiten greifen müssen, um den Wert zu ermitteln.

Was sie nicht sind, sind Konstanten im Sinne von K & R, und aus diesem Grund sollten ihre Bezeichner nicht in Großbuchstaben geschrieben werden. Einige Leute benutzen sie auf diese Weise, aber es ist keine Praxis, die ich empfehlen kann, außer in einigen speziellen Fällen.

Blrfl
quelle
Ich werde das akzeptieren, und obwohl ich die Antwort zu schätzen enumweiß, scheinen die Absätze, dass es sich nicht um erstklassige Typen handelt und dass es sich um Redefinitionskonflikte handelt, nicht relevant zu sein. Dass in der ersten Ausgabe von K & R die Praxis der "symbolischen Konstanten" beschrieben wurde, reicht aus. (Auch nachdem ich meine Kopie der zweiten Ausgabe von K & R überprüft habe, sehe ich, dass ihre Beispiele alle Namenskonstanten enumin Großbuchstaben darstellen, so dass Ihre Antwort weiter validiert wird.)
jamesdlin