Jaka jest historia nazywania stałych wielkimi literami?

20

Jaka jest historia konwencji nazywania wielkimi literami?

Moją intuicją jest to, że zaczęło się od preprocesora C, gdzie ludzie opracowali praktykę nazywania makr preprocesora wielkimi literami, aby skutecznie żyć w osobnej przestrzeni nazw i unikać kolizji nazw. Wierzę, że ta praktyka została następnie źle zrozumiana i zakazana, aby stosować ją również do stałych ( zmiennych enum, constzmiennych) niepreprocesorowych.

Nazywanie makr preprocesora wielkimi literami wydaje mi się naprawdę przydatne. W ten sposób nazywa się stałe stałe, nie tyle (i przynosi efekt przeciwny do zamierzonego, jeśli powoduje kolizje z nazwami makr).

Czy jestem poza bazą? Czy praktyka kapitalizacji stałych była wcześniejsza niż C?

jamesdlin
źródło
3
Myślę, że tu jesteś. Wczesne języki miały prawie wszystko wielkimi literami, a później małe litery stały się modne. Wydaje się, że wczesne książki C zwykle zawierają constmałe i #definesduż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! :)
David Arno
Zgadzam się z @DavidArno prawdopodobnie ze względu na naturę C lub asemblera.
Snoop

Odpowiedzi:

13

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 enumzdefiniowano je, określano je mianem stałych wyliczeniowych i omówiono w rozdziale o stałych. Ponieważ stałe zdefiniowane przez an enumsą 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 enumjako 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, #definektó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 BAZzostały ponownie zdefiniowane. (To była poprawa w stosunku do preprocesora, który w tamtym czasie nie ostrzegał przed jednym #definezatkaniem 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 constkluczowe 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 constto 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 constbę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.

Blrfl
źródło
Zaakceptuję to i choć doceniam odpowiedź, enumakapity o tym, że nie są pierwszorzędnymi typami i o konfliktach redefinicji, wydają się nie mieć znaczenia. Wystarczy, że pierwsze wydanie K&R opisuje praktykę polegającą na „stałych symbolicznych”. (Ponadto po sprawdzeniu mojej kopii drugiego wydania K&R widzę, że w ich przykładach wszystkie enumstałe nazw są
zapisane