Для C первая редакция языка программирования C (он же K & R) предполагает, что ваша интуиция о макросах препроцессора верна:
Имена символических констант обычно пишутся в верхнем регистре, поэтому их легко отличить от имен переменных в нижнем регистре.
Во многих отношениях это было пережитком ассемблера, где макросы определялись в верхнем регистре вместе с метками, кодами операций, именами регистров и всем остальным. Появление сборки в стиле AT & T изменило это на некоторых платформах, но я думаю, что на него сильно повлиял тот факт, что терминалы, поддерживающие строчные буквы, стали чем-то особенным, а Unix был тем, что я бы назвал «строчной операционной системой».
По остальным двум пунктам ты бьешься .500:
Enum
К моменту публикации второго издания enum
s были определены, они назывались константами перечисления и рассматривались в разделе о константах. Поскольку константы, определяемые выражением 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, и поэтому их идентификаторы не должны быть в верхнем регистре. Некоторые люди используют их таким образом, но я рекомендую не такую практику, за исключением нескольких конкретных случаев.
const
идентификаторы в нижнем и#defines
верхнем регистре . Java, хотя и принял верхний регистр для констант и других языков, последовал, но я мог бы ошибиться. Требуются дополнительные исследования! :)