2016-06-26 2 views
0

Я пишу простой класс ведения журнала на C++ для обучения. Мой код содержит функцию, которая возвращает строку сегодняшней даты. Тем не менее, я получаю ошибку компилятора всякий раз, когда вызывается «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 внутри определений препроцессора в свойствах проекта. Это дало нерешенную внешнюю ошибку.

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

+0

Где точное предупреждение? «localtime» может быть опасным для использования, поскольку он возвращает указатель на область памяти, которой он владеет, поэтому, если вы вызываете его несколько раз, вам нужно каждый раз проверять структуру. Также, кстати, способ создания строки, если вы получаете «2112016», вы не знаете, если это 21/1/2016 или 2/11/2016. –

ответ

1

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

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

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

Вот что я делаю (непроверенные на Windows):

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)}; 
} 
+1

Протестировано на Windows и отлично работает. –

Смежные вопросы