Какова история именования констант в верхнем регистре?

20

Какова история условного обозначения констант в верхнем регистре?

Моя интуиция заключается в том, что это началось с препроцессора C, где люди разработали практику именования макросов препроцессора в верхнем регистре, чтобы они эффективно жили в отдельном пространстве имен и избегали конфликтов имен. Я считаю, что эта практика была затем неправильно и извращается применить к не-препроцессора констант тоже ( enumс, constпеременные).

Наименование макросов препроцессора в верхнем регистре кажется мне действительно полезным. Именование общих констант таким образом, не так много (и контрпродуктивно, если это создает коллизии с именами макросов).

Я с базы? Практика использования заглавных букв констант предшествовала C?

jamesdlin
источник
3
Я думаю, что ты прямо здесь. У ранних языков было почти все в верхнем регистре, а использование строчных стало модным позже. Ранние книги на Си, как правило, показывают constидентификаторы в нижнем и #definesверхнем регистре . Java, хотя и принял верхний регистр для констант и других языков, последовал, но я мог бы ошибиться. Требуются дополнительные исследования! :)
Дэвид Арно
Я согласен с @DavidArno, вероятно, из-за природы C или ассемблера.
Снуп

Ответы:

13

Для C первая редакция языка программирования C (он же K & R) предполагает, что ваша интуиция о макросах препроцессора верна:

Имена символических констант обычно пишутся в верхнем регистре, поэтому их легко отличить от имен переменных в нижнем регистре.

Во многих отношениях это было пережитком ассемблера, где макросы определялись в верхнем регистре вместе с метками, кодами операций, именами регистров и всем остальным. Появление сборки в стиле AT & T изменило это на некоторых платформах, но я думаю, что на него сильно повлиял тот факт, что терминалы, поддерживающие строчные буквы, стали чем-то особенным, а Unix был тем, что я бы назвал «строчной операционной системой».

По остальным двум пунктам ты бьешься .500:

Enum

К моменту публикации второго издания enums были определены, они назывались константами перечисления и рассматривались в разделе о константах. Поскольку константы, определяемые выражением enum, представлены символами, это делает их символическими константами, которые, если вы собираетесь следовать рекомендованному соглашению, должны быть названы в верхнем регистре. (Как и макросы препроцессора, ничто не мешает вам поступить иначе.)

Здесь подразумевается, что в отличие от некоторых последующих языков C не относится enumк первому типу класса, в котором сами типы различаются, значения перечисления специфичны для каждого типа и могут использоваться повторно в других. Вместо этого это удобный удобный способ записи #defineпоследовательностей целых чисел с прикрепленными идентификаторами. Это делает

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

недопустимый, потому что все символы разделяют область и BAZпереопределяются. (Это было улучшение по сравнению с препроцессором, который в то время не предупреждал об одном #defineзабивании другого.) Кроме того, C не волнует, смешиваете ли вы их, потому что все они просто целые числа, что делает

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

enum foo variable = BLETCH;

полностью допустимо даже на современном компиляторе со всеми включенными предупреждениями.

Const

NB. constКлючевое слово возникло в 1981 году с помощью Страуструпа C With Classes (которое превратилось в C ++) и в конечном итоге было принято C. Выбор имени неудачен, потому что он вступает в противоречие с использованием термина K & R термина « константа» для обозначения того, что мы теперь будем называть буквальный (например 38, 'x'или "squabble"). Текст во втором издании не был переписан, чтобы отразить это.

Объявленные переменные const- это отдельная история, потому что они все еще переменные. Они не должны изменяться, но имеет ли смысл понятие постоянной переменной больше, чем, скажем, гигантская креветка, является пищей для другого обсуждения. Как бы то ни было, C никогда не относился к этому серьезно, потому что стандарт требует, чтобы компилятор выдавал диагностику, когда вы пытаетесь ее изменить. Фактическое поведение не определено, если модификация компилируется и выполняется.

Будучи переменными, имеет смысл, что все constбудет следовать условию именования в нижнем регистре. Использование их для представления литералов имеет некоторые преимущества безопасности типов, но не способствует хорошей оптимизации, если для получения значения нужно добраться между блоками компиляции.

Они не являются константами в смысле K & R, и поэтому их идентификаторы не должны быть в верхнем регистре. Некоторые люди используют их таким образом, но я рекомендую не такую ​​практику, за исключением нескольких конкретных случаев.

Blrfl
источник
Я собираюсь принять это, и хотя я ценю ответ, enumпараграфы о том, чтобы не быть первоклассными типами и о конфликтах переопределения, не кажутся актуальными. То, что в первом издании K & R описана практика «символических констант», достаточно. (Кроме того, после проверки моей копии второго издания K & R, я вижу, что в их примерах все enumконстанты имен указаны в верхнем регистре, что еще более подтверждает ваш ответ.)
jamesdlin