Razones para no
En primer lugar, aquí hay una razón para no escribir guiones bajos ni utilizar ningún truco para simularlo: hace que las constantes sean más difíciles de encontrar en el código. Suponga que algún programa exhibe, en algún lugar de su operación, un valor codificado 1500000 para algún parámetro. Quiero saber en qué parte del código fuente del programa ocurre esto, así que busco el código 1500000y no encuentro nada. ¿Por qué? Podría estar en hexadecimal (pero por qué para un número decimal tan redondo). Sin saberlo, la constante en realidad se escribe como 1_500_000. Necesitaba la expresión regular 1_?500_?000.
Guiando Personajes en Comentario
El hecho de que un tipo de ayuda visual no esté disponible, o no deseamos usarlo por la razón anterior, no significa que no podamos aprovechar las dos dimensiones del archivo de texto para crear una ayuda visual alternativa:
foo = bar / 1000000000;
// --^--^--^
Con esto podemos convencernos fácilmente de que hay tres grupos de tres ceros. Sin embargo, todavía podemos obtener el código fuente 1000000000y encontrarlo.
Colorear Sintaxis
Se puede hacer un editor de texto con coloración de sintaxis programable para agrupar los dígitos de los grupos en constantes numéricas con colores alternos para una mejor legibilidad. No tenemos que hacer nada en el código.
Preprocesamiento: C, C ++, Objetivo C
Ahora, si realmente queremos algunas comas entre dígitos, en C y C ++ podemos usar algún preprocesamiento:
/* 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).
Una macro similar a TH también puede funcionar con pegado de token en lugar de aritmética. En el preprocesador C, el ##operador binario ("token paste") se puede usar en un cuerpo de macro para pegar dos operandos en un solo token. Uno o ambos operandos pueden ser argumentos macro. La desventaja aquí (creando un riesgo para nosotros) es que si la catetación resultante no es un token válido, el comportamiento es indefinido.
#define TOK4(A, B, C, D) A ## B ## C ## D
Ahora
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 */
Los programas en C que pegan los identificadores y usan los resultados para nombrar variables y funciones globales existen y son horribles para trabajar porque son impermeables a herramientas como GNU id-utils y ctags.