localtime和localtime_r
函數原型
localtime 用於將simple calender time 轉換為broken-down time, 如果調用成功將返回一個指向struct tm結構的靜態地址,而這是可以被其他函數所重寫的, 所以在從這點可以看出 ,它是不安全,所以localtime_r的出現就是為了解決這一問題,
從函數原型可以看出 , localtime_r比localtime多個result的形參(這不就是_r尾綴的由來?),將原本的靜態地址的tm數據結構傳到用戶定義的結構里面, 如果成功調用,返回值將和傳入的結構地址相同。同時要注意的是, 如果轉換失敗, 出現數據溢出情況, 返回值為null。
c++中localtime中的支持情況
localtime_r只在linux平台上可用, windows平台只能用localtime_s,而在c++的標准庫中沒有一個統一的標准, 只能依賴於c語言的localtime,所以在寫c++多線程程序中不可避免的就要判斷是否支持線程安全的localtime。
好消息是c++20的chrono庫中的zoned_time已經彌補了這塊。
#include <chrono>
#include <iostream>
int
main()
{
namespace chr = std::chrono;
chr::zoned_time local_time{chr::current_zone(), chr::system_clock::now()};
std::cout << local_time << '\n';
}