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 enum
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 macht
enum foo { BAR, BAZ };
enum quux { BLETCH, BAZ };
ungü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 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 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 Beispiel 38
, '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.
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! :)