Яка історія називання констант у всіх великих літерах?


20

Яка історія стоїть за конвенцією іменування констант у всіх великих літерах?

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

Названня макросів препроцесора у всіх великих літерах мені здається справді корисним. Таким чином називати загальні константи не так вже й багато (і контрпродуктивно, якщо це створює зіткнення з іменами макросів).

Я не в базі? Чи була практика використання великих констант перед С?


3
Я думаю, ти тут. На ранніх мовах було майже все в верхньому регістрі, а використання нижнього регістру стало модним пізніше. Як видається, у ранніх книгах С зазвичай constідентифікатори відображаються як малі та #definesвеликі регістри. Java хоч і прийняла верхній регістр для констант та інших мов, але я міг помилитися з цим останнім. Потрібно більше досліджень! :)
Девід Арно

Я погоджуюся з @DavidArno, ймовірно, із-за природи C або асемблера.
Snoop

Відповіді:


13

Що стосується 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, і тому їхні ідентифікатори не повинні бути великими літерами. Деякі люди їх використовують таким чином, але це не рекомендую практику, за винятком кількох конкретних випадків.


Я збираюся це прийняти, і хоча я ціную відповідь, enumпараграфи про те, що вони не є першокласними типами, і про конфлікти з переосмисленням, не здаються актуальними. Те, що в першому виданні K&R було описано практику використання "символічних констант", достатньо. (Крім того, перевіривши мою копію другого видання K&R, я бачу, що їхні приклади всі називають enumконстантами у всіх великих
літерах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.