如何用 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 变量。 (timestampvtimestamp 从那个时代算起。)

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)的主要内容,如果未能解决你的问题,请参考以下文章

C++中打印uint64_t

C++中打印uint64_t

C++中打印uint64_t

C语言之如何输出uint32_t和uint64_t和16进制

32/64位平台printf uint64的方法

uint64, sizet_t, ssizet_t