Причини не робити
По-перше, тут є причина не писати підкреслення або використовувати якийсь трюк для їх моделювання: це константи ускладнює пошук у коді. Припустимо, що деяка програма демонструє десь під час своєї роботи жорстке кодування значення 1500000 для якогось параметра. Я хочу знати, де в вихідному коді програми це відбувається насправді, тому я перебираю код 1500000
і нічого не знаходжу. Чому? Це може бути в шістнадцятковій цифрі (але навіщо таке кругле десяткове число). Невідома для мене, константа насправді пишеться як 1_500_000
. Мені потрібен був регулярний вираз 1_?500_?000
.
Керівні персонажі в коментарі
Тільки тому, що один вид наочної допомоги не доступний, або ми не хочемо використовувати його з вищевказаної причини, не означає, що ми не можемо скористатися двома вимірами текстового файлу для створення альтернативної візуальної допомоги:
foo = bar / 1000000000;
// --^--^--^
З цим ми легко можемо переконати себе у тому, що існує три групи з трьох нулів. Тим не менш, ми все ще можемо зібрати вихідний код 1000000000
і знайти його.
Розмальовки синтаксису
Текстовий редактор з програмованим синтаксичним забарвленням можна зробити для кольорових груп цифрами в числових константах з чергуванням кольорів для кращої читабельності. Нам не потрібно нічого робити в коді.
Попередня обробка: C, C ++, ціль C
Тепер, якщо ми дійсно хочемо деякої коми після цифр, в C і C ++ ми можемо використовувати деяку попередню обробку:
/* 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)
Працює для таких чисел TH(1,234,567,890)
.
Макрос, схожий на TH, також може працювати з вставкою лексеми, а не арифметикою. У препроцесорі С двійковий ##
оператор ("лексема вставки") може використовуватися в макроконтролі, щоб склеїти два операнди в один маркер. Один або обидва операнди можуть бути макроаргументами. Мінус тут (створюючи для нас ризик) полягає в тому, що якщо результуюча катенація не є дійсним маркером, поведінка не визначається.
#define TOK4(A, B, C, D) A ## B ## C ## D
Тепер
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, які склеюють ідентифікатори та використовують результати для іменування глобальних змінних та функцій, існують і з ними жахливо працювати, оскільки вони непроникні для таких інструментів, як id-утиліти та ctag GNU.