C++ localtime vs localtime_s和适当的输入参数

C++ localtime vs localtime_s和适当的输入参数,c++,localtime,C++,Localtime,这将返回:警告C4996:“localtime”:此函数或变量可能不安全。考虑使用LoalalTimeS代替.< /P> time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); 当我将localtime更改为localtime时,我得到:错误C2660:“localtime”:函数不接受1个参数 以下是我认为在第一段代码中发生的事情: 创建一个空时间

这将返回:警告C4996:“localtime”:此函数或变量可能不安全。考虑使用LoalalTimeS代替.< /P>
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
当我将localtime更改为localtime时,我得到:错误C2660:“localtime”:函数不接受1个参数

以下是我认为在第一段代码中发生的事情:

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

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

LoalTimeIs只是微软LoalTimeFaston的一个实现,可以安全地使用<代码> LoaTime<代码>,因为它是C++ ISO兼容的,微软把它标记为“弃用”。在C++世界中,LoalTimeType本身并没有被禁止。

localtime\s
表示应将这些参数传递给它:

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

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

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

_tm 
Pointer to the time structure to be filled in.
 time 
Pointer to the stored time.
例如:

struct tm *timeinfo;
timeinfo = localtime(&rawtime);
这样,它就可以写入您的缓冲区,而不是拥有自己的缓冲区。

正如所指出的,
localtime
与其他几个时间函数一样,不是线程安全的。我想更多地了解这个主题,我发现了一个深思熟虑的粗略解释

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

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


localtime需要第二个输入参数是什么?
Google今天已经启动并运行了。是的,我立即发现了这个问题:但我还不知道如何解释这些模板/泛型?方法说明。就像我不理解一般形式维基数学文章的语法/符号一样。struct tm*_tm和const time _t*time对我来说没有任何意义,因为我真正告诉了这个方法。。。虽然我希望是这样。是的,我也有一些。通过这些更改,我得到了以下错误:错误C2679:二进制“=”:未找到运算符,该运算符采用“errno\u t”类型的右操作数(或没有可接受的转换)1>c:\Program Files\Microsoft Visual Studio 10.0\VC\include\wchar.h(1120):可能是“tm&tm::operator=(const tm&)“1>尝试匹配参数列表”(tm,errno_t)时出现错误C2664:“strftime”:无法将参数4从“tm”转换为“const tm*”1>没有可执行此转换的用户定义的转换运算符,或者该运算符无法called@ProGirlXOXO:这显然发生在上面没有显示的代码中,但这可能是因为
timeinfo
现在是
struct tm
而不是指针,所以在其他函数使用它的地方,您需要将
timeinfo
更改为
&timeinfo
。此行:&timeinfo=localtime\s(&timeinfo,&rawtime);给出此错误:错误C2440:“=”:无法从“errno_t”转换为“tm*”@ProGirlXOXO:重新读取答案
localtime
返回指向
struct tm
的指针--
localtime\u s
不返回(它返回一个错误号,告诉您请求的转换是否成功)。FWIW,POSIX标准更正函数为
localtime\r
。工作原理完全相同,只是两个参数的顺序相反。
localtime\u s
是自C11以来的一部分。@Pietro仅作为的一部分,事实上,Microsoft只(很差)实现了。Per:“由于与规范的大量偏差,Microsoft实现不能被视为符合要求或可移植。”@AndrewHenle-感谢您指出这一点。请阅读cppreference:“在Microsoft CRT中实现localtime_s与C标准不兼容,因为它颠倒了参数顺序。”
struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);