2016-06-26 84 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不是線程安全的,因爲它使用了一個靜態緩衝區(在線程之間共享)。 POSIXWindows都有安全替代品:localtime_rlocaltime_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上測試並正常工作。 –

相關問題