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个参数
以下是我认为在第一段代码中发生的事情:
将原始时间转换为对行人有意义的东西
答案 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 *的内容之前,可以覆盖静态缓冲区。