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

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

Это возвращает: предупреждение C4996: «местное время»: эта функция или переменная может быть небезопасной. Попробуйте вместо этого использовать localtime_s.

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

Когда я изменяю местное время на localtime_s, я получаю: ошибка C2660: ‘localtime_s’: функция не принимает 1 аргумент

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

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

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

42

Решение

localtime возвращает указатель на статически размещенный struct tm,

С помощью localtime_s вы передаете указатель на структуру tm и localtime_s записывает в него свои результаты, так что ваш код изменится с:

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

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

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

Таким образом, он пишет ваш буфер вместо того, чтобы иметь собственный буфер.

51

Другие решения

localtime_s — это просто реализация Microsoft функции localtime, которую вы можете безопасно использовать locatime потому что это C ++ ISO-совместимый и только Microsoft пометил его как «устаревший». Сама функция localtime вообще не устарела в мире C ++.

localtime_s ссылка говорит, что эти параметры должны быть переданы ему:

_tm
Pointer to the time structure to be filled in.
time
Pointer to the stored time.
7

Как Гонки легкости на орбите указал, localtime не является потокобезопасным, а также несколько других функций времени. Я хотел узнать больше о предмете, и я нашел соответствующее сообщение в блоге с продуманным объяснением об этом.

Цитата ниже объясняет почему localtimeне является потокобезопасным:

[…] localtime возвращает указатель на статический буфер (std :: tm *). Другой поток может вызвать функцию, и статический буфер может быть перезаписан до того, как первый поток завершит чтение содержимого структуры std :: tm *.

6
По вопросам рекламы [email protected]