localtime vs localtime_s和适当的输入参数

Pro*_*OXO 50 c++ localtime

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
Run Code Online (Sandbox Code Playgroud)

返回:警告C4996:'localtime':此函数或变量可能不安全.请考虑使用localtime_s.

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime_s ( &rawtime );
Run Code Online (Sandbox Code Playgroud)

当我将localtime更改为localtime_s时,我得到:错误C2660:'localtime_s':函数不带1个参数

以下是我认为在第一个代码块中正在进行的操作:

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

    1. 我对吗?
    2. localtime_s需要什么第二个输入参数?
    3. 如果我忽略整个当地时间的安全问题,可能会发生什么最糟糕的事情.

Jer*_*fin 59

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

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

struct tm *timeinfo;
timeinfo = localtime(&rawtime);
Run Code Online (Sandbox Code Playgroud)

类似于:

struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,它是写你的缓冲区,而不是有它自己的缓冲区.

  • @ProGirlXOXO:重读答案.`localtime`返回指向`struct tm`的指针 - `localtime_s` does*not*(它返回一个错误号,告诉你请求的转换是否成功). (4认同)

小智 7

localtime_s只是本地时间功能的微软实现,你可以放心使用,locatime因为它符合C++ ISO标准并且ony microsoft将其标记为"已弃用".在C++世界中,本地时间函数本身并未被弃用.

localtime_s 参考指出,应将这些参数传递给它:

_tm 
Pointer to the time structure to be filled in.
 time 
Pointer to the stored time.
Run Code Online (Sandbox Code Playgroud)

  • 实际上它在多线程代码中是不安全的. (21认同)
  • FWIW,POSIX标准校正函数是`localtime_r`.工作完全相同,除了两个参数的顺序相反. (10认同)

For*_*gic 6

正如Orbit中的Lightness Races指出的那样,localtime不是线程安全以及其他几个时间功能.我想了解更多关于这个主题的内容,我找到了一篇相关的博文,其中有一个关于这个问题的解释.

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

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