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 ( enum
s, const
Variablen) 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?
quelle
const
Bezeichner in Kleinbuchstaben und#defines
in 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! :)Antworten:
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:
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 Konstantenenum
durch 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
enum
erstklassigen 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 machtungültig, da alle Symbole den Gültigkeitsbereich teilen und
BAZ
neu definiert werden. (Dies war eine Verbesserung gegenüber dem Präprozessor, der zu der Zeit nicht davor gewarnt hat, dass ein#define
Prozessor einen anderen stört.) Außerdem ist es C egal, ob Sie sie mischen, weil sie alle nur Ganzzahlen sind, die erzeugenDies gilt auch für einen modernen Compiler, bei dem alle Warnungen aktiviert sind.
Const
NB: Das
const
Schlü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 Beispiel38
,'x'
oder"squabble"
). Der Text in der zweiten Ausgabe wurde nicht umgeschrieben, um dies widerzuspiegeln.Deklarierte Variablen
const
sind 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
const
der 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.
quelle
enum
weiß, 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 Namenskonstantenenum
in Großbuchstaben darstellen, so dass Ihre Antwort weiter validiert wird.)