localtime vs localtime_s和适当的输入参数

时间:2013-01-17 19:47:37

标签: c++ localtime

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. 如果我忽略整个本地安全问题,可能会发生的最坏情况。

3 个答案:

答案 0 :(得分:54)

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

的指针

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

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

类似于:

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

通过这种方式,它正在写入你的缓冲区,而不是拥有自己的缓冲区。

答案 1 :(得分:7)

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

localtime_s reference表示应将这些参数传递给它:

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

答案 2 :(得分:6)

正如Lightness Races in Orbit指出的那样,localtime不是线程安全的,也不是其他几个时间函数。我想了解更多关于这个主题的内容,我发现a relevant blog post对此有一个解释。

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

  

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