Що стосується C, перше видання мови програмування на C (він же K&R) говорить про те, що ваша інтуїція щодо макросів препроцесора правильна:
Символічні постійні імена зазвичай пишуться у верхньому регістрі, тому їх можна легко відрізнити від імен змінних нижнього регістру.
Багато в чому це було перехоплення від мови складання, де макроси визначалися з великого регістру разом з мітками, опкодами, іменами регістрів та всім іншим. Поява збірки в стилі AT & T змінила ситуацію на деяких платформах, але я думаю, що на це сильно вплинуло те, що термінали, що підтримують малі регістри, стають річчю, а Unix - це те, що я б назвав "малою операційною системою".
За іншими двома пунктами ви б'єте .500:
Енум
На момент виходу другого видання було enum
визначено, що вони називаються константами перерахування та висвітлюються у розділі про константи. Оскільки константи, визначені 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
Ключове слово виникло в 1981 році зі класами Струструпа з класами (які перетворилися на C ++) і врешті було прийнято С. Вибір імені невдалий, оскільки він зіткнеться з використанням терміна константа K&R, щоб означати те, що ми зараз би називали a буквальне (наприклад 38
, 'x'
або "squabble"
). Текст у другій редакції не був переписаний, щоб відобразити це.
Заявлені змінні const
- це інша історія, оскільки вони все ще є змінними. Вони не повинні бути змінені, але чи поняття постійної змінної має більше сенсу, ніж, скажімо, креветки-джамбо - корм для іншого обговорення. Як би це не було, C ніколи не був серйозним щодо цього, оскільки стандарт вимагає, щоб компілятор випробовував діагностику при спробі змінити його. Фактична поведінка не визначена, якщо модифікація складена та виконана.
Будучи змінними, має сенс, що будь-що const
буде слідувати конвенції про те, що називатися з малих літер. Використання їх для представлення літералів має певні переваги щодо безпеки, але не забезпечує хорошої оптимізації, якщо вам доведеться досягти значення між компіляційними одиницями.
Вони не є константами в розумінні K&R, і тому їхні ідентифікатори не повинні бути великими літерами. Деякі люди їх використовують таким чином, але це не рекомендую практику, за винятком кількох конкретних випадків.
const
ідентифікатори відображаються як малі та#defines
великі регістри. Java хоч і прийняла верхній регістр для констант та інших мов, але я міг помилитися з цим останнім. Потрібно більше досліджень! :)