Предупреждение: формат "%06d" ожидает тип "int", но аргумент 5 имеет тип "__suseconds_t"

Я использую этот код:

struct timeval tv;
time_t nowtime;
struct tm *nowtm;
char tmbuf[64], buf[64];

gettimeofday(&tv, NULL);
nowtime = tv.tv_sec;
nowtm = localtime(&nowtime);
strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);
snprintf(buf, sizeof buf, "%s.%06d", tmbuf, tv.tv_usec);

из этого так ответьте:

/questions/17136604/vremennaya-struktura-v-pechatnyij-format/17136637#17136637

распечатать структуру timeval в читаемом формате. Тем не менее, я получаю это предупреждение компилятора:

warning: format '%06d' expects type 'int', but argument 5 has type '__suseconds_t'

Может ли кто-нибудь помочь, пожалуйста?

2 ответа

Решение

tv_usec член struct tv структура является __suseconds_t тип данных, который является typedef для long, Вы можете отобразить это с %06ld вместо %06d,

И это похоже на бросок к long было бы лучше, по крайней мере, для вопросов переносимости.

Компилятор выдает предупреждение, потому что тип, ожидаемый printf - int не совпадает с типом аргумента - long (который является то, что __suseconds_t является). Ваш код будет работать во многих современных системах, когда бы int а также long одинакового размера (32 или 64 бита).

Поскольку существуют системы, в которых это не так (например, int 32-bit, long 64 bit), для лучшей переносимости вы должны привести значение к фактическому типу. printf надеется:

snprintf(buf, sizeof buf, "%s.%06ld", tmbuf, (long) tv.tv_usec);

Как значение tv.tv_usec всегда меньше, чем миллион, в системе с по крайней мере 32 битными "%06d" и приведение к int также будет работать, но я бы предпочел остаться с долго.

Кстати, предупреждение указывает на проблему со всеми этими typedef, которые используются в наши дни. Я думаю, что относительный новичок мог бы иметь больше шансов понять реальную проблему, если бы в сообщении упоминалось long вместо или в дополнение к __suseconds_t, Компилятор Clang фактически делает это: "'__suseconds_t' (aka 'long')",

Другие вопросы по тегам