Qual è la cronologia delle costanti di denominazione in maiuscolo?

17

Qual è la storia dietro la convenzione delle costanti di denominazione in maiuscolo?

La mia intuizione è che è iniziata con il preprocessore C, in cui le persone sviluppavano una pratica per denominare macro preprocessore in tutte le lettere maiuscole in modo che potessero effettivamente vivere in uno spazio dei nomi separato ed evitare conflitti di nomi. La mia convinzione è che questa pratica è stata poi fraintesa e bastardizzata da applicare anche alle costanti non preprocessuali ( enum s, const variabili).

Il nome delle macro del preprocessore in maiuscolo sembra davvero utile per me. Dare un nome alle costanti generali in questo modo, non tanto (e controproducente se crea collisioni con nomi di macro).

Sono fuori base? La pratica delle maiuscole delle costanti era precedente a C?

    
posta jamesdlin 28.05.2016 - 12:12
fonte

1 risposta

11

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.

    
risposta data 28.05.2016 - 19:47
fonte

Leggi altre domande sui tag