Предупреждение: формат "%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')"
,