Localtime vs localtime_s和适当的输入参数

localtime vs localtime_s and appropriate input arguments

本文关键字:输入 参数 vs localtime Localtime      更新时间:2023-10-16
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );

返回:警告C4996: 'localtime':这个函数或变量可能不安全。考虑使用localtime_s。

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime_s ( &rawtime );

当我将本地时间更改为localtime_s时,我得到:错误C2660: 'localtime_s':函数不接受1个参数

下面是我认为的第一块代码:

  • 创建一个空time_t变量
  • 在ctime中定义一个指向timeinfo的指针
  • 将原始时间写入原始时间引用
  • 将原始时间转换为对行人有意义的东西

      我说的对吗?
  • localtime_s需要什么第二个输入参数?
  • 如果我忽略整个本地时间安全问题,最坏的情况会是什么?

localtime返回一个指向静态分配的struct tm的指针。

使用localtime_s,您传入一个指向结构体tm的指针,并且localtime_s将其结果数据写入其中,因此您的代码将更改为:

struct tm *timeinfo;
timeinfo = localtime(&rawtime);

转换成:

struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);

这样,它会写入你的缓冲区,而不是有自己的缓冲区。

localtime_s只是localtime函数的微软实现,您可以安全地继续使用locatime,因为它是c++ ISO兼容的,只有微软将其标记为"已弃用"。在c++世界中,localtime函数本身并没有被弃用。

localtime_s引用说这些参数应该传递给它:

_tm 
Pointer to the time structure to be filled in.
 time 
Pointer to the stored time.

正如Lightness Races in Orbit所指出的那样,localtime和其他几个时间函数一样不是线程安全的。我想更多地了解这个主题,我找到了一篇相关的博客文章,上面有详细的解释。

下面的引号解释了为什么localtime不是线程安全的:

[…localtime返回一个指向静态缓冲区(std::tm*)的指针。另一个线程可以调用该函数,并且静态缓冲区可以在第一个线程完成读取struct std::tm*的内容之前被覆盖。