D语言如何正确打印uint64_t(dtrace)
How to print uint64_t properly in D language (dtrace)
我正在尝试使用 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++ 编程语言)的其他编程语言混淆。
根据DTrace Wiki: Output Formatting:
The D compiler does not require the use of size prefixes with printf format conversions.
The C printf routine requires that you indicate the size of arguments by adding prefixes such as %ld for long or %lld for long long.
The D compiler knows the size and type of your arguments, so these prefixes are not required in your D printf statements.
此外,D 中的 %d
和 %i
格式将处理有符号或无符号整数,因此您可以使用 %d
、%i
或 %u
以 10 为基数打印一个无符号整数值,所有结果都相同。
OP 在评论中询问了 %Y
格式。这可用于包含自 1970 年 1 月 1 日纪元以来的纳秒数的 uint64_t 值,例如内置 walltimestamp 变量。 (timestamp
和 vtimestamp
是 不是 从那个纪元开始计算的。)
The uint64_t argument is interpreted to be the number of nanoseconds since 00:00 Universal Coordinated Time, January 1, 1970, and is printed in the following cftime(3C) form: "%Y %a %b %e %T %Z."
我正在尝试使用 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++ 编程语言)的其他编程语言混淆。
根据DTrace Wiki: Output Formatting:
The D compiler does not require the use of size prefixes with printf format conversions. The C printf routine requires that you indicate the size of arguments by adding prefixes such as %ld for long or %lld for long long. The D compiler knows the size and type of your arguments, so these prefixes are not required in your D printf statements.
此外,D 中的 %d
和 %i
格式将处理有符号或无符号整数,因此您可以使用 %d
、%i
或 %u
以 10 为基数打印一个无符号整数值,所有结果都相同。
OP 在评论中询问了 %Y
格式。这可用于包含自 1970 年 1 月 1 日纪元以来的纳秒数的 uint64_t 值,例如内置 walltimestamp 变量。 (timestamp
和 vtimestamp
是 不是 从那个纪元开始计算的。)
The uint64_t argument is interpreted to be the number of nanoseconds since 00:00 Universal Coordinated Time, January 1, 1970, and is printed in the following cftime(3C) form: "%Y %a %b %e %T %Z."