55
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 更改为 localtime_s 时,我得到:错误 C2660:'localtime_s':函数不接受 1 个参数

这是我认为在第一个代码块中发生的事情:

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

    1. 我对吗?
    2. localtime_s 需要什么第二个输入参数?
    3. 如果我忽略整个本地时间安全问题,可能发生的最坏情况是什么。
4

3 回答 3

67

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

使用 localtime_s,您传入一个指向 struct tm 的指针,并将localtime_s其结果数据写入其中,因此您的代码将从:

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

类似于:

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

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

于 2013-01-17T19:54:41.907 回答
8

localtime_s 只是本地时间函数的微软实现,您可以安全地继续使用,locatime因为它符合 C++ ISO 标准并且只有微软将其标记为“已弃用”。localtime 函数本身在 C++ 世界中根本不被弃用。

localtime_s 参考资料说这些参数应该传递给它:

_tm 
Pointer to the time structure to be filled in.
 time 
Pointer to the stored time.
于 2013-01-17T19:52:40.797 回答
6

正如Orbit 中的 Lightness Races所指出的,localtime它不是线程安全的以及其他几个时间函数。我想了解更多有关该主题的信息,并找到了一篇相关的博客文章,其中对此进行了详尽的解释。

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

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

于 2013-07-18T04:29:55.227 回答