date — ‘localtime’, эта функция или переменная может быть небезопасной

Я пишу простой класс ведения журнала на C ++ для целей обучения. Мой код содержит функцию, которая возвращает строку сегодняшней даты. Однако я получаю ошибку компилятора всякий раз, когда вызывается localtime.

std::string get_date_string(time_t *time) {
struct tm *now = localtime(time);
std::string date = std::to_string(now->tm_mday) + std::to_string(now->tm_mon) + std::to_string(now->tm_year);
return date;
}

Я пытался использовать #define _CRT_SECURE_NO_WARNINGS, Это не сработало, и появилась та же ошибка. Я тоже пробовал ставить _CRT_SECURE_NO_WARNINGS внутри определения препроцессора в свойствах проекта. Это дало неразрешенную внешнюю ошибку.

У кого-нибудь есть идеи, что делать?

2

Решение

Пробовать #define _CRT_SECURE_NO_WARNINGS до #include любые другие заголовочные файлы, например, следующий код

#define _CRT_SECURE_NO_WARNINGS
#include <ctime>
//your code
1

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

Проблема в том, что std::localtime не является потокобезопасным, поскольку использует статический буфер (совместно используемый потоками). И то и другое POSIX а также Windows есть безопасные альтернативы: localtime_r а также localtime_s.

Вот что я делаю:

inline std::tm localtime_xp(std::time_t timer)
{
std::tm bt {};
#if defined(__unix__)
localtime_r(&timer, &bt);
#elif defined(_MSC_VER)
localtime_s(&bt, &timer);
#else
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
bt = *std::localtime(&timer);
#endif
return bt;
}

// default = "YYYY-MM-DD HH:MM:SS"inline std::string time_stamp(const std::string& fmt = "%F %T")
{
auto bt = localtime_xp(std::time(0));
char buf[64];
return {buf, std::strftime(buf, sizeof(buf), fmt.c_str(), &bt)};
}
9

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