Powody, dla których nie
Po pierwsze, oto powód, dla którego nie należy pisać podkreślników ani używać żadnej sztuczki, aby to zasymulować: utrudnia to znalezienie stałych w kodzie. Załóżmy, że jakiś program wykazuje gdzieś w działaniu zakodowaną wartość 1500000 dla jakiegoś parametru. Chcę wiedzieć, gdzie w kodzie źródłowym programu tak się dzieje, więc szukam kodu 1500000
i nic nie znajduję. Czemu? Może być w systemie szesnastkowym (ale dlaczego tak okrągłej liczby dziesiętnej). Bez mojej wiedzy stała jest tak naprawdę zapisana jako 1_500_000
. Potrzebowałem wyrażenia regularnego 1_?500_?000
.
Prowadzenie postaci w komentarzu
To, że jeden rodzaj pomocy wizualnej nie jest dostępny lub nie chcemy jej używać z powyższego powodu, nie oznacza, że nie możemy skorzystać z dwóch wymiarów pliku tekstowego, aby stworzyć alternatywną pomoc wizualną:
foo = bar / 1000000000;
// --^--^--^
Dzięki temu możemy łatwo przekonać się, że istnieją trzy grupy trzech zer. Jednak nadal możemy grepować kod źródłowy 1000000000
i go znaleźć.
Kolorowanie składni
Edytor tekstu z programowalnym kolorowaniem składni może być utworzony w celu grupowania cyfr cyfr w stałych liczbowych naprzemiennymi kolorami dla lepszej czytelności. Nie musimy nic robić w kodzie.
Przetwarzanie wstępne: C, C ++, Cel C
Teraz, jeśli naprawdę chcemy przecinków między cyframi, w C i C ++ możemy użyć przetwarzania wstępnego:
/* 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)
Działa dla liczb takich jak TH(1,234,567,890)
.
Makro podobne do TH może również działać z wklejaniem tokenów, a nie z arytmetyką. W preprocesorze C ##
operator binarny („wklej token”) może być użyty w ciele makra w celu wklejenia dwóch operandów w jeden token. Jeden lub oba operandy mogą być argumentami makr. Minusem tutaj (stwarzającym dla nas ryzyko) jest to, że jeśli wynikowa catenacja nie jest prawidłowym tokenem, zachowanie jest niezdefiniowane.
#define TOK4(A, B, C, D) A ## B ## C ## D
Teraz
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 */
Istnieją programy typu C, które wklejają identyfikatory i używają wyników do nazwania zmiennych globalnych i funkcji, i są okropne w pracy, ponieważ są odporne na narzędzia takie jak narzędzia GNU i ctag.