Ragioni per non farlo
In primo luogo, ecco un motivo per non scrivere caratteri di sottolineatura o usare alcun trucco per simularlo: rende le costanti più difficili da trovare nel codice. Supponiamo che alcuni programmi mostrino, da qualche parte nel suo funzionamento, un valore hard-code 1500000 per alcuni parametri. Voglio sapere dove si verifica effettivamente nel codice sorgente del programma, quindi grep il codice 1500000
e non trovo nulla. Perché? Potrebbe essere in esadecimali (ma perché per un numero decimale tondo). A mia insaputa, la costante è in realtà scritta come 1_500_000
. Avevo bisogno di regex 1_?500_?000
.
Personaggi guida nel commento
Solo perché un tipo di aiuto visivo non è disponibile o non desideriamo utilizzarlo per il motivo precedente, non significa che non possiamo sfruttare le due dimensioni del file di testo per creare un aiuto visivo alternativo:
foo = bar / 1000000000;
// --^--^--^
Con questo possiamo facilmente convincerci che ci sono tre gruppi di tre zeri. Tuttavia, possiamo ancora grep per il codice sorgente 1000000000
e trovarlo.
Sintassi da colorare
Un editor di testo con colorazione di sintassi programmabile può essere creato per colorare gruppi di cifre in costanti numeriche con colori alternati per una migliore leggibilità. Non dobbiamo fare nulla nel codice.
Preelaborazione: C, C ++, Obiettivo C
Ora, se vogliamo davvero alcune virgole tra le cifre, in C e C ++ possiamo usare un po 'di preelaborazione:
/* 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 incollare token anziché con l'aritmetica. Nel preprocessore C, l' ##
operatore binario ("token paste") può essere utilizzato in un corpo macro per incollare due operandi in un singolo token. Uno o entrambi gli operandi possono essere argomenti macro. Il rovescio della medaglia qui (creando un rischio per noi) è che se la catenazione risultante non è un token valido, il comportamento non è definito.
#define TOK4(A, B, C, D) A ## B ## C ## D
Adesso
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 */
Esistono programmi C che incollano identificatori e usano i risultati per nominare variabili e funzioni globali e sono terribili con cui lavorare perché sono impermeabili a strumenti come GNU id-utils e ctags.