Gründe, nicht zu
Erstens gibt es hier einen Grund, keine Unterstriche zu schreiben oder einen Trick zu verwenden, um dies zu simulieren: Es erschwert das Auffinden der Konstanten im Code. Angenommen, ein Programm weist irgendwo in seiner Operation einen fest codierten Wert von 1500000 für einen Parameter auf. Ich möchte wissen, wo im Quellcode des Programms dies tatsächlich vorkommt, also greife ich nach dem Code 1500000
und finde nichts. Warum? Könnte es hexadezimal sein (aber warum für eine solche runde Dezimalzahl). Mir ist nicht bekannt, dass die Konstante tatsächlich so geschrieben ist 1_500_000
. Ich brauchte den Regex 1_?500_?000
.
Leitfiguren im Kommentar
Nur weil eine Art von visueller Hilfe nicht verfügbar ist oder wir sie aus dem oben genannten Grund nicht verwenden möchten, bedeutet dies nicht, dass wir die beiden Dimensionen der Textdatei nicht nutzen können, um eine alternative visuelle Hilfe zu erstellen:
foo = bar / 1000000000;
// --^--^--^
Damit können wir uns leicht davon überzeugen, dass es drei Gruppen von drei Nullen gibt. Trotzdem können wir den Quellcode durchsuchen 1000000000
und finden.
Syntax-Färbung
Ein Texteditor mit programmierbarer Syntaxfärbung kann zur besseren Lesbarkeit in numerischen Konstanten mit alternierenden Farben in Farbgruppen eingeteilt werden. Wir müssen nichts im Code tun.
Vorverarbeitung: C, C ++, Ziel C
Wenn wir nun wirklich Kommas zwischen Ziffern wollen, können wir in C und C ++ eine Vorverarbeitung verwenden:
/* 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)
Funktioniert für Zahlen wie TH(1,234,567,890)
.
Ein TH-ähnliches Makro kann auch mit Token-Einfügen anstelle von Arithmetik arbeiten. Im C-Präprozessor kann der Binäroperator ##
("Token Paste") in einem Makrotext verwendet werden, um zwei Operanden zu einem einzigen Token zusammenzufügen. Einer oder beide Operanden können Makroargumente sein. Der Nachteil hier (was ein Risiko für uns darstellt) ist, dass das Verhalten undefiniert ist, wenn die resultierende Verkettung kein gültiges Token ist.
#define TOK4(A, B, C, D) A ## B ## C ## D
Jetzt
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 */
C-Programme, die Bezeichner zusammenfügen und die Ergebnisse verwenden, um globale Variablen und Funktionen zu benennen, existieren und sind schrecklich zu bearbeiten, da sie für Tools wie GNU-ID-Utils und -Ctags undurchlässig sind.