0

localtime vs localtime_s: соответствующие аргументы ввода

9

Вопрос по поводу использования функции localtime и localtime_s в C++

Я столкнулся с проблемой при работе с функциями localtime и localtime_s в C++. Вот мой код:

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );

При компиляции я получаю предупреждение:

warning C4996: 'localtime': Эта функция или переменная может быть небезопасной. Рассмотрите возможность использования localtime_s вместо нее.

Когда я заменяю localtime на localtime_s, код выглядит так:

time_t rawtime;
struct tm timeinfo;
time ( &rawtime );
localtime_s ( &timeinfo, &rawtime );

Однако я получаю ошибку:

error C2660: 'localtime_s': функция не принимает 1 аргумент

Мои предположения относительно первого блока кода:

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

Вопросы:

  1. Правильно ли я понимаю, что происходит в первом блоке кода?
  2. Какой второй параметр нужен функции localtime_s?
  3. Какие последствия могут быть, если я просто проигнорирую вопрос безопасности функции localtime?

Спасибо за помощь!

1 ответ(ов)

0

localtime возвращает указатель на статически выделенную структуру tm, что может приводить к проблемам с многопоточностью, так как вызовы этой функции из разных потоков могут перезаписывать данные.

Вместо этого, вы можете использовать localtime_s, которая требует указатель на вашу структуру tm в качестве аргумента. Это позволяет записывать данные непосредственно в ваш буфер вместо использования внутреннего буфера функции. Ваш код изменится с:

struct tm *timeinfo;
timeinfo = localtime(&rawtime);

на что-то вроде:

struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);

Таким образом, вы избегаете проблем с многопоточностью, так как localtime_s записывает результат в вашу структуру, а не использует свою собственную статическую память.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь