Per C, la prima edizione di The C Programming Language (aka K&R) suggerisce che la tua intuizione sulle macro del preprocessore è corretta:
I nomi delle costanti simboliche sono comunemente scritti in maiuscolo, quindi possono essere facilmente distinti dai nomi delle variabili in minuscolo.
In molti modi, si trattava di una sospensione dal linguaggio assembly, in cui le macro venivano definite in maiuscolo insieme a etichette, codici operativi, nomi di registro e tutto il resto. L'avvento dell'assemblaggio in stile AT & T ha cambiato quello su alcune piattaforme, ma penso che sia stato fortemente influenzato dal fatto che i terminali che supportano le lettere minuscole stavano diventando una cosa e Unix era quello che definirei un "sistema operativo minuscolo".
Sugli altri due punti, stai battendo .500:
enum
Al momento della pubblicazione della seconda edizione, enum
erano stati definiti s, erano indicati come costanti di enumerazione e trattati nella sezione sulle costanti. Poiché le costanti definite da un enum
sono rappresentate da simboli, ciò le rende costanti simboliche, che, se seguirai la convenzione consigliata, dovrebbero essere nominate in maiuscolo. (Come le macro del preprocessore, nulla ti impedisce di fare diversamente.)
L'implicazione qui è che, diversamente da alcuni linguaggi che seguirono, C non tratta enum
come un tipo di prima classe in cui i tipi stessi sono distinti, i valori di enumerazione sono specifici per ciascun tipo e possono essere riutilizzati in altri. Invece, è effettivamente una scorciatoia conveniente per #define
quella che produce sequenze di numeri interi con identificatori collegati. Questo fa
enum foo { BAR, BAZ };
enum quux { BLETCH, BAZ };
non valido perché tutti i simboli condividono l'ambito ed BAZ
è ridefinito. (Questo è stato un miglioramento rispetto al preprocessore che, al momento, non ha avvertito che uno che ne sta #define
bloccando un altro.) Inoltre, a C non importa se li mescoli perché sono tutti interi, rendendo
enum foo { BAR, BAZ };
enum quux { BLETCH, BLRFL };
enum foo variable = BLETCH;
completamente valido anche su un moderno compilatore con tutti gli avvisi attivati.
const
NB: La const
parola chiave è nata nel 1981 con C With Classes di Stroustrup (che si è evoluta in C ++) e alla fine è stata adottata da C. La scelta del nome è sfortunata, perché si scontra con l'uso del termine costante di K&R per indicare ciò che ora chiameremmo un letterale (ad es. 38
, 'x'
o "squabble"
). Il testo della seconda edizione non è stato riscritto per riflettere ciò.
Le variabili dichiarate const
sono una storia diversa perché sono ancora variabili. Non dovrebbero essere modificati, ma se la nozione di una variabile costante abbia più senso di, diciamo, i gamberi giganti è foraggio per un'altra discussione. In ogni caso, C non è mai stato davvero serio al riguardo perché lo standard richiede che il compilatore emetta una diagnostica quando si tenta di cambiarne uno. Il comportamento effettivo non è definito se una modifica viene compilata ed eseguita.
Essendo variabili, ha senso che qualsiasi cosa const
segua la convenzione di essere nominato in minuscolo. Il loro utilizzo per rappresentare i valori letterali presenta alcuni vantaggi in termini di sicurezza, ma non consente una buona ottimizzazione se è necessario raggiungere le unità di compilazione per ottenere il valore.
Ciò che non sono costanti nel senso di K&R, e per questo motivo i loro identificatori non dovrebbero essere maiuscoli. Alcune persone li usano in questo modo, ma non è una pratica che raccomando tranne in alcuni casi specifici.
const
identificatori in minuscolo e#defines
maiuscolo. Java ha comunque adottato lettere maiuscole per le costanti e altre lingue seguite, ma potrei sbagliare un po '. Sono necessarie ulteriori ricerche! :)