不这样做的原因
首先,这是不写任何下划线或使用任何技巧对其进行模拟的原因:这使常量在代码中更难找到。假设某个程序在其操作的某个位置显示某个参数的硬编码值1500000。我想知道这在程序源代码中实际发生的位置,因此我对进行了grep编码1500000
,却一无所获。为什么?可能采用十六进制格式(但是为什么要使用舍入十进制数)。我不知道,常数实际上写为1_500_000
。我需要正则表达式1_?500_?000
。
注释中的引导字符
仅仅因为一种视觉辅助工具不可用,或者我们不希望由于上述原因而使用它,并不意味着我们无法利用文本文件的两个维度来创建替代的视觉辅助工具:
foo = bar / 1000000000;
// --^--^--^
有了这个,我们可以轻松地说服自己,三个零的三组。但是,我们仍然可以grep的源代码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的宏也可以使用令牌粘贴而不是算术。在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之类的工具。