Причины не
Во-первых, вот причина, по которой вы не пишете подчеркивания или не используете какой-либо трюк для его симуляции: это затрудняет поиск констант в коде. Предположим, что какая-то программа показывает где-то в своей работе жестко закодированное значение 1500000 для некоторого параметра. Я хочу знать, где в исходном коде программы это на самом деле происходит, поэтому я набираю код 1500000
и ничего не нахожу. Зачем? Это может быть в шестнадцатеричном (но почему для такого круглого десятичного числа). Без моего ведома, константа на самом деле записывается как 1_500_000
. Мне нужно регулярное выражение 1_?500_?000
.
Руководящие символы в комментарии
Тот факт, что один вид визуального пособия недоступен или мы не хотим использовать его по вышеуказанной причине, не означает, что мы не можем воспользоваться двумя измерениями текстового файла для создания альтернативного визуального средства:
foo = bar / 1000000000;
// --^--^--^
При этом мы можем легко убедить себя, что есть три группы из трех нулей. Тем не менее, мы все еще можем 1000000000
найти исходный код и найти его.
Синтаксис Раскраска
Текстовый редактор с программируемой синтаксической окраской может быть сделан для цветовых групп чисел в числовых константах с чередующимися цветами для лучшей читаемости. Нам не нужно ничего делать в коде.
Предварительная обработка: C, C ++, Objective 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, также может работать с вставкой токена, а не с арифметикой. В препроцессоре C бинарный ##
оператор («вставка токена») может использоваться в теле макроса для вставки двух операндов в один токен. Один или оба операнда могут быть макро-аргументами. Недостатком (создающим для нас риск) является то, что если полученная цепочка не является допустимым токеном, поведение не определено.
#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, которые вставляют идентификаторы и используют результаты для именования глобальных переменных и функций, существуют и с ними ужасно работать, потому что они невосприимчивы к таким инструментам, как GNU id-utils и ctags.