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';
}