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 аргумент
Вот что, я думаю, происходит в первом блоке кода:
превратить сырье во что-то значимое для пешеходов
localtime
возвращает указатель на статически размещенный struct tm
,
С помощью localtime_s вы передаете указатель на структуру tm и localtime_s
записывает в него свои результаты, так что ваш код изменится с:
struct tm *timeinfo;
timeinfo = localtime(&rawtime);
что-то вроде:
struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);
Таким образом, он пишет ваш буфер вместо того, чтобы иметь собственный буфер.
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.
Как Гонки легкости на орбите указал, localtime
не является потокобезопасным, а также несколько других функций времени. Я хотел узнать больше о предмете, и я нашел соответствующее сообщение в блоге с продуманным объяснением об этом.
Цитата ниже объясняет почему localtime
не является потокобезопасным:
[…] localtime возвращает указатель на статический буфер (std :: tm *). Другой поток может вызвать функцию, и статический буфер может быть перезаписан до того, как первый поток завершит чтение содержимого структуры std :: tm *.