Per C, la prima edizione di The C Programming Language (a.k.a. K & R) suggerisce che la tua intuizione sui macro del preprocessore sia corretta:
Symbolic constant names are commonly written in upper case so they can be readily distinguished from lower case
variable names.
In molti modi, si trattava di un residuo del linguaggio assembly, in cui le macro erano definite in maiuscolo insieme a etichette, opcode, nomi di registro e tutto il resto. L'avvento di AT & T-style assembly è cambiato su alcune piattaforme, ma penso che sia stato strongmente influenzato dal fatto che i terminali che supportano lettere minuscole stavano diventando una cosa e Unix era quello che chiamerei un "sistema operativo in lettere minuscole".
Sugli altri due punti, stai battendo .500:
Enum
Quando è stata pubblicata la seconda edizione, enum
s era stato definito, venivano definiti come costanti di enumerazione e trattati nella sezione sulle costanti. Poiché le costanti definite da enum
sono rappresentate da simboli, ciò le rende costanti simboliche, che, se si intende seguire la convenzione consigliata, devono essere denominate in maiuscolo. (Come le macro del preprocessore, nulla ti impedisce di fare diversamente.)
L'implicazione qui è che diversamente da alcuni linguaggi che seguono, C non considera enum
come un tipo di prima classe in cui i tipi stessi sono distinti, i valori di enumerazione sono specifici per ogni tipo e possono essere riutilizzati in altri. Invece, è effettivamente una comoda scorciatoia per #define
che produce sequenze di numeri interi con identificatori allegati. Questo rende
enum foo { BAR, BAZ };
enum quux { BLETCH, BAZ };
non valido perché tutti i simboli condividono lo scope e BAZ
viene ridefinito. (Questo è stato un miglioramento rispetto al preprocessore che, al momento, non ha avvertito circa un #define
che ne sta scontrando un altro.) Inoltre, a C non importa se li si mescola perché sono tutti solo numeri 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 parola chiave const
è nata nel 1981 con C With Classes di Stroustrup (che si è evoluta in C ++) ed è stata infine adottata da C. La scelta del nome è sfortunata, perché si scontra con l'uso di K & em> costante significa ciò che ora chiameremmo letterale (es. 38
, 'x'
o "squabble"
). Il testo nella seconda edizione non è stato riscritto per riflettere quello.
Le variabili dichiarate const
sono una storia diversa perché sono ancora variabili. Non dovrebbero essere modificati, ma se la nozione di variabile costante abbia più senso di, ad esempio, i gamberetti jumbo è foraggio per un'altra discussione. In ogni caso, C non è mai stato veramente serio a riguardo perché lo standard richiede solo che il compilatore emetta una diagnostica quando si tenta di cambiarne uno. Il comportamento effettivo non è definito se una modifica è compilata ed eseguita.
Essendo variabili, ha senso che qualsiasi cosa const
segua la convenzione di essere chiamata in minuscolo. Usarli per rappresentare letterali ha alcuni vantaggi in termini di sicurezza, ma non rappresenta una buona ottimizzazione se devi raggiungere le unità di compilazione per ottenere il valore.
Ciò che non sono 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.