Localtime vs localtime_s и соответствующие входные аргументы
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
Это возвращает: предупреждение C4996: "localtime": эта функция или переменная могут быть небезопасными. Вместо этого используйте localtime_s.
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime_s ( &rawtime );
Когда я изменяю localtime на localtime_s, я получаю: ошибка C2660: "localtime_s": функция не принимает 1 аргумент
Вот что я думаю, происходит в первом блоке кода:
Ответы
Ответ 1
localtime
возвращает указатель на статически выделенный struct tm
.
С localtime_s вы передаете указатель на структуру tm, а localtime_s
записывает в нее свои данные результата, поэтому ваш код изменится с:
struct tm *timeinfo;
timeinfo = localtime(&rawtime);
к чему-то вроде:
struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);
Таким образом, он записывается в ваш буфер вместо собственного буфера.
Ответ 2
localtime_s - это просто реализация локального функционала microsoft, вы можете спокойно использовать locatime
, потому что он совместим с С++ ISO, а ony microsoft обозначил его как "устаревший". Сама локальная функция вообще не устаревает в мире С++.
Ссылка localtime_s
говорит, что эти параметры должны быть переданы ему:
_tm
Pointer to the time structure to be filled in.
time
Pointer to the stored time.
Ответ 3
Как Легкость гонки на орбите, отметил, localtime
не является потокобезопасным, а также несколькими другими функциями времени. Я хотел узнать больше о предмете, и я нашел соответствующее сообщение в блоге с объяснением об этом.
В приведенной ниже цитате объясняется, почему localtime
не является потокобезопасным:
[...] localtime возвращает указатель на статический буфер (std:: tm *). Другой поток может вызывать функцию, а статический буфер можно перезаписать до того, как первый поток завершит чтение содержимого структуры std:: tm *.