Razões para não
Primeiro, aqui está uma razão para não escrever sublinhados ou usar qualquer truque para simulá-lo: torna as constantes mais difíceis de encontrar no código. Suponha que algum programa exiba, em algum lugar de sua operação, o valor codificado 1500000 para algum parâmetro. Quero saber onde isso realmente ocorre no código-fonte do programa, por isso espero o código 1500000
e não encontro nada. Por quê? Pode estar em hexadecimal (mas por que, para um número decimal tão redondo). Sem o meu conhecimento, a constante é realmente escrita como 1_500_000
. Eu precisava do regex 1_?500_?000
.
Caracteres orientadores no comentário
Só porque um tipo de auxílio visual não está disponível, ou não queremos usá-lo pelo motivo acima, não significa que não possamos tirar proveito das duas dimensões do arquivo de texto para criar um auxílio visual alternativo:
foo = bar / 1000000000;
// --^--^--^
Com isso, podemos facilmente nos convencer de que existem três grupos de três zeros. No entanto, ainda podemos 1000000000
encontrar e encontrar o código-fonte .
Coloração de sintaxe
Um editor de texto com coloração de sintaxe programável pode ser feito para grupos de dígitos de cores em constantes numéricas com cores alternadas para melhor legibilidade. Não precisamos fazer nada no código.
Pré-processamento: C, C ++, Objetivo C
Agora, se realmente queremos vírgulas entre dígitos, em C e C ++, podemos usar algum pré-processamento:
/* 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)
Funciona para números como TH(1,234,567,890)
.
Uma macro semelhante ao TH também pode trabalhar com colagem de token em vez de aritmética. No pré-processador C, o ##
operador binário ("pasta de token") pode ser usado em um corpo de macro para colar dois operandos em um único token. Um ou ambos os operandos podem ser argumentos de macro. A desvantagem aqui (criando um risco para nós) é que, se a catenação resultante não for um token válido, o comportamento será indefinido.
#define TOK4(A, B, C, D) A ## B ## C ## D
Agora
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 */
Existem programas C que colam identificadores e usam os resultados para nomear variáveis e funções globais e são difíceis de trabalhar porque são impermeáveis a ferramentas como GNU id-utils e ctags.