如何用 D 语言正确打印 uint64_t (dtrace)
Posted
技术标签:
【中文标题】如何用 D 语言正确打印 uint64_t (dtrace)【英文标题】:How to print uint64_t properly in D language (dtrace) 【发布时间】:2015-07-14 18:01:38 【问题描述】:我正在尝试使用DTrace
脚本来printf
一些Solaris
类型为uint64_t
(例如timestamp
)的内核级信息。如何在我的DTrace
代码中安全准确地打印uint64_t
。
我知道在 C 中打印uint64_t
的正确方法是:
#define __STDC_FORMAT_MACROS
#include <sys/inttypes.h> //sys: Kernel level
uint64_t timestamp;
printf("%"PRIu64"\n", timestamp);
DTrace
D 中的等价物是什么? (%d
和 `%llu 不精确且危险)。
注意不要与其他名为“D”的编程语言(由 Walter Bright 开发的类似 C++ 的编程语言)混淆。
【问题讨论】:
【参考方案1】:根据DTrace Wiki: Output Formatting:
D 编译器不需要在 printf 格式转换中使用大小前缀。 C printf 例程要求您通过添加前缀来指示参数的大小,例如 %ld 表示 long 或 %lld 表示 long long。 D 编译器知道参数的大小和类型,因此在 D printf 语句中不需要这些前缀。
此外,D 中的%d
和%i
格式将处理有符号或无符号整数,因此您可以使用%d
、%i
或%u
中的任何一个来打印基数中的无符号整数值10,结果都一样。
OP 在评论中询问了%Y
格式。这可用于 uint64_t 值,该值包含自 1970 年 1 月 1 日以来的纳秒数,例如内置的walltimestamp 变量。 (timestamp
和 vtimestamp
不从那个时代算起。)
uint64_t 参数被解释为自 1970 年 1 月 1 日 00:00 以来的纳秒数,并以以下 cftime(3C) 格式打印:“%Y %a %b %e %T %Z。”
【讨论】:
这是否意味着我可以使用%d
安全地printf
一个uint64_t
变量,或者我应该通过%Y
打印它?
谢谢。我已经编辑了我的答案以建议使用哪种整数格式,以及%Y
。以上是关于如何用 D 语言正确打印 uint64_t (dtrace)的主要内容,如果未能解决你的问题,请参考以下文章