Motivi non a
In primo luogo, ecco una ragione per non scrivere alcun trattino basso o usare alcun trucco per simularlo: rende le costanti più difficili da trovare nel codice. Supponiamo che qualche programma presenti, da qualche parte nella sua operazione, un valore hard-coded 1500000 per alcuni parametri. Voglio sapere dove si trova effettivamente il codice sorgente del programma, quindi grep il codice per 1500000
e non trovo nulla. Perché? Potrebbe essere in esadecimale (ma perché per un numero decimale rotondo tale). A mia insaputa, la costante è in realtà scritta come 1_500_000
. Mi serviva la regex 1_?500_?000
.
Guida ai caratteri nel commento
Solo perché un tipo di aiuto visivo non è disponibile, o non vogliamo usarlo per la ragione sopra, non significa che non possiamo sfruttare le due dimensioni del file di testo per creare un visual alternativo aiuto:
foo = bar / 1000000000;
// --^--^--^
Con questo possiamo facilmente convincerci che ci sono tre gruppi di tre zeri. Tuttavia, possiamo ancora grep il codice sorgente per 1000000000
e trovarlo.
Colorazione sintassi
È possibile creare un editor di testo con colorazione sintassi programmabile per raggruppare i numeri di cifre in costanti numeriche con colori alternati per una migliore leggibilità. Non dobbiamo fare nulla nel codice.
Pre-elaborazione: C, C ++, obiettivo C
Ora, se vogliamo davvero alcune virgole tra le cifre, in C e C ++ possiamo usare un po 'di pre-elaborazione:
/* Four digit base TH-ousand constant macro */
/* Condensed using Horner's rule */
#define TH(A,B,C,D) ((((((A) * 1000) + (B)) * 1000) + (C)) * 1000 + D)
tv_sec = nanoseconds / TH(1,000,000,000)
Funziona per numeri come TH(1,234,567,890)
.
Una macro simile a TH può anche funzionare con l'aggiunta di token piuttosto che con l'aritmetica. Nel preprocessore C, l'operatore binario ##
("token paste") può essere utilizzato in un corpo macro per incollare insieme due operandi in un singolo token. Uno o entrambi gli operandi possono essere argomenti macro. Il lato negativo qui (creando un rischio per noi) è che se la catenaria risultante non è un token valido, il comportamento non è definito.
#define TOK4(A, B, C, D) A ## B ## C ## D
Ora
TOK4(1,000,000,000) /* produces the single token 1000000000 */
TOK4(1,123,000,000.0E+2) /* produces the single token 1123000000.0E+2 */
TOK4(pr,in,t,f) /* produces the token printf */
TOK4(#,*,a,b) /* undefined behavior, #*ab is not valid token syntax */
I programmi C che incollano gli identificatori e usano i risultati per nominare le variabili e le funzioni globali esistono e sono terribili su cui lavorare perché sono impermeabili a strumenti come GNU id-utils e ctags.