W przypadku C pierwsze wydanie The C Programming Language (alias K&R) sugeruje, że Twoja intuicja dotycząca makr preprocesora jest poprawna:
Nazwy stałe symboliczne są zwykle pisane dużymi literami, dzięki czemu można je łatwo odróżnić od nazw zmiennych małych.
Pod wieloma względami był to pozostałość po języku asemblera, w którym makra były definiowane wielkimi literami wraz z etykietami, kodami operacyjnymi, nazwami rejestrów i wszystkim innym. Pojawienie się montażu w stylu AT & T zmieniło to na niektórych platformach, ale myślę, że był pod dużym wpływem faktu, że terminale obsługujące małe litery stały się czymś, a Unix był tym, co nazwałbym „systemem operacyjnym małych liter”.
W pozostałych dwóch punktach mrugasz .500:
Enum
Do czasu opublikowania drugiego wydania enum
zdefiniowano je, określano je mianem stałych wyliczeniowych i omówiono w rozdziale o stałych. Ponieważ stałe zdefiniowane przez an enum
są reprezentowane przez symbole, co czyni je stałymi symbolicznymi, które, jeśli zamierzasz stosować się do zalecanej konwencji, powinny być nazwane wielkimi literami. (Podobnie jak makra preprocesora, nic nie stoi na przeszkodzie, aby zrobić inaczej).
Implikacja tutaj jest taka, że w przeciwieństwie do niektórych późniejszych języków, C nie traktuje enum
jako typu pierwszej klasy, gdzie same typy są różne, wartości wyliczenia są specyficzne dla każdego typu i mogą być ponownie użyte w innych. Zamiast tego jest to faktycznie wygodny skrót, #define
który tworzy sekwencje liczb całkowitych z dołączonymi identyfikatorami. To sprawia
enum foo { BAR, BAZ };
enum quux { BLETCH, BAZ };
niepoprawna, ponieważ wszystkie symbole mają wspólny zakres i BAZ
zostały ponownie zdefiniowane. (To była poprawa w stosunku do preprocesora, który w tamtym czasie nie ostrzegał przed jednym #define
zatkaniem drugiego). Ponadto C nie obchodzi, czy je pomieszasz, ponieważ wszystkie są tylko liczbami całkowitymi, dzięki czemu
enum foo { BAR, BAZ };
enum quux { BLETCH, BLRFL };
enum foo variable = BLETCH;
całkowicie poprawny nawet w nowoczesnym kompilatorze z włączonymi wszystkimi ostrzeżeniami.
Const
Uwaga: Słowo const
kluczowe powstało w 1981 r. W C z klasami Stroustrupa (które przekształciło się w C ++) i ostatecznie zostało przyjęte przez C. Wybór nazwy jest niefortunny, ponieważ koliduje z użyciem przez K&R terminu stała w celu oznaczenia tego, co nazwalibyśmy teraz dosłownym (na przykład 38
, 'x'
i "squabble"
). Tekst w drugim wydaniu nie został przepisany, aby to odzwierciedlić.
Deklarowane zmienne const
to inna historia, ponieważ nadal są zmiennymi. Nie należy ich modyfikować, ale czy pojęcie zmiennej stałej ma sens bardziej niż, powiedzmy, krewetki jumbo są pożywieniem do kolejnej dyskusji. Cokolwiek by to nie było, C nigdy tak naprawdę nie podchodził do tego poważnie, ponieważ standard wymaga tylko, aby kompilator emitował komunikat diagnostyczny podczas próby zmiany. Rzeczywiste zachowanie nie jest zdefiniowane, jeśli modyfikacja zostanie skompilowana i wykonana.
Będąc zmiennymi, sensowne jest, że wszystko const
będzie zgodne z konwencją bycia nazwanym małymi literami. Używanie ich do reprezentowania literałów ma pewne zalety w zakresie bezpieczeństwa, ale nie zapewnia dobrej optymalizacji, jeśli trzeba sięgać między jednostkami kompilacji, aby uzyskać wartość.
To, czym nie są, to stałe w sensie K&R iz tego powodu ich identyfikatory nie powinny być pisane wielkimi literami. Niektóre osoby używają ich w ten sposób, ale nie jest to zalecana praktyka, z wyjątkiem kilku szczególnych przypadków.
const
małe i#defines
duże litery . Mimo to Java przyjęła wielkie litery dla stałych i innych języków, ale ten ostatni błąd mógł być zły. Potrzebne są dalsze badania! :)