Подтвердить что ты не робот

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 аргумент

Вот что я думаю, происходит в первом блоке кода:

  • создать пустую переменную time_t.
  • создать указатель на timeinfo, который определяется в ctime
  • напишите rawtime в ссылку rawtime
  • преобразовать исходное время во что-то значимое для пешеходов

    • Я прав?
    • Какой второй параметр ввода нужен localtime_s?
    • Самое худшее, что может произойти, если я просто проигнорирую всю проблему безопасности локального времени.
4b9b3361

Ответ 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 *.