Raisons pour ne pas
Tout d'abord, voici une raison pour ne pas écrire de soulignement ou utiliser une astuce pour le simuler: cela rend les constantes plus difficiles à trouver dans le code. Supposons que certains programmes présentent, quelque part dans leur fonctionnement, la valeur codée en dur 1500000 pour un paramètre donné. Je veux savoir où cela se produit réellement dans le code source du programme. Je recherche donc le code 1500000
et ne trouve rien. Pourquoi? Pourrait-il être en hexadécimal (mais pourquoi pour un nombre décimal aussi rond). À l'insu de moi, la constante est en fait écrite comme 1_500_000
. J'avais besoin de la regex 1_?500_?000
.
Caractères guides en commentaire
Ce n’est pas parce qu’un type d’aide visuelle n’est pas disponible ou si nous ne souhaitons pas l’utiliser pour les raisons susmentionnées que nous ne pouvons pas tirer parti des deux dimensions du fichier texte pour créer un autre moyen d’affichage:
foo = bar / 1000000000;
// --^--^--^
Avec cela, nous pouvons facilement nous convaincre qu'il existe trois groupes de trois zéros. Cependant, nous pouvons toujours rechercher le code source 1000000000
et le trouver.
Coloration de la syntaxe
Un éditeur de texte avec coloration de syntaxe programmable peut être utilisé pour colorer les groupes de chiffres en constantes numériques avec des couleurs alternées pour une meilleure lisibilité. Nous n'avons rien à faire dans le code.
Prétraitement: C, C ++, Objective C
Maintenant, si nous voulons vraiment des virgules entre les chiffres, en C et C ++, nous pouvons utiliser un prétraitement:
/* 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)
Fonctionne pour les nombres comme TH(1,234,567,890)
.
Une macro similaire à TH peut également fonctionner avec un collage de jetons plutôt que de l'arithmétique. Dans le préprocesseur C, l’ ##
opérateur binaire ("token paste") peut être utilisé dans un corps de macro afin de coller ensemble deux opérandes dans un seul jeton. Un ou les deux opérandes peuvent être des macro-arguments. L'inconvénient ici (créer un risque pour nous) est que si la caténation résultante n'est pas un jeton valide, le comportement n'est pas défini.
#define TOK4(A, B, C, D) A ## B ## C ## D
À présent
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 */
Les programmes C qui collent ensemble des identificateurs et utilisent les résultats pour nommer des variables et des fonctions globales existent et sont terribles, car ils sont insensibles aux outils tels que GNU id-utils et ctags.