2015-07-14 2 views
2

Я пытаюсь printf некоторую информацию об уровне Solaris ядра с типом uint64_t (например timestamp) с использованием DTrace сценария. Как я могу напечатать uint64_t безопасно и точно в моем коде DTrace.Как напечатать uint64_t должным образом в языке D (DTrace)

Я знаю, правильный способ печати 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» (язык программирования на языке C++, разработанный Уолтером Брайтом).

ответ

1

По DTrace Wiki: Output Formatting:

Д компилятор не требует использования префиксов размера с преобразованием форматов Printf. Процедура C printf требует, чтобы вы указывали размер аргументов, добавляя префиксы, такие как% ld для long или% lld в течение длительного времени. Компилятор D знает размер и тип ваших аргументов, поэтому эти префиксы не требуются в ваших инструкциях D printf.

Кроме того, %d и %i форматы в D будет обрабатывать либо знаком или без знака Интс, так что вы можете использовать любой из %d, %i или %u напечатать целое число без знака в базе 10, все с теми же результатами ,

ОП запросил в комментарии о формате %Y. Это можно использовать для значения uint64_t, которое содержит число наносекунд с эпохи 1 января 1970 года, например, встроенная переменная walltimestamp. (timestamp и vtimestampявляются не отсчитывается от той эпохи.)

uint64_t аргумент интерпретируется как число наносекунд, поскольку 00:00 всемирного координированного времени, 1 января 1970 года, и печатается в следующем cftime (3C): "% Y% a% b% e% T% Z."

+0

Означает ли это, что я могу безопасно «printf' использовать переменную' uint64_t', используя '% d', или я должен печатать ее через'% Y'? –

+0

Спасибо. Я отредактировал свой ответ, чтобы предложить, какие целочисленные форматы использовать, а также '% Y'. –