当前位置:  开发笔记 > 编程语言 > 正文

Using a #define in a formatted printf to define precision

如何解决《Usinga#defineinaformattedprintftodefineprecision》经验,为你挑选了1个好方法。

要扩展该宏使其成为编译时格式字符串的一部分,您将需要一个字符串化宏(是的,这两个层是必需的;如果仅定义#define STR(x) #xSTR(PREC)则会插入字符串"PREC",而不是"4"您想要的字符串):

#define _STR(x) #x
#define STR(x) _STR(x)

然后,您可以像这样使用它:

printf("%0" STR(PREC) "ld", l);

预处理器会将其扩展为:

printf("%0" "4" "ld", l);

并且由于相邻的字符串文字被视为单个字符串,因此最终编译起来就像直接键入一样:

printf("%04ld", l);

对于运行时解决方案,您可以使用参数*来动态设置精度,而无需使用字符串化宏:

printf("%0*ld", PREC, l);

从理论上讲,这在运行时会稍慢一些,因为它需要解析更复杂的格式字符串,传递和接收更多参数,等等,但是实际上I / O太昂贵了,以至于在CPU摆弄一点儿成本就显得微不足道了。比较。

请注意0,两个版本中都添加了,以使其填充零而不是空格。



1> ShadowRanger..:

要扩展该宏使其成为编译时格式字符串的一部分,您将需要一个字符串化宏(是的,这两个层是必需的;如果仅定义#define STR(x) #xSTR(PREC)则会插入字符串"PREC",而不是"4"您想要的字符串):

#define _STR(x) #x
#define STR(x) _STR(x)

然后,您可以像这样使用它:

printf("%0" STR(PREC) "ld", l);

预处理器会将其扩展为:

printf("%0" "4" "ld", l);

并且由于相邻的字符串文字被视为单个字符串,因此最终编译起来就像直接键入一样:

printf("%04ld", l);

对于运行时解决方案,您可以使用参数*来动态设置精度,而无需使用字符串化宏:

printf("%0*ld", PREC, l);

从理论上讲,这在运行时会稍慢一些,因为它需要解析更复杂的格式字符串,传递和接收更多参数,等等,但是实际上I / O太昂贵了,以至于在CPU摆弄一点儿成本就显得微不足道了。比较。

请注意0,两个版本中都添加了,以使其填充零而不是空格。

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有