C++ 在C+中实现时间的错误代码+;
这是我的一个函数的实现,它可以查找时间、日期等,。。。。等等 我不知道为什么,但我得到了一个错误: 1> c:\users\sebastien\blabla:警告C4244:“参数”:从“time\t”转换为“unsigned int”,可能会丢失数据 1> DateHeure.cpp 1> c:\users\sebastien\blabla->错误C4996:“localtime”:此函数或变量可能不安全。考虑使用LoalTimeTys代替。要禁用弃用,请使用_CRT\u SECURE\u NO\u警告。有关详细信息,请参阅联机帮助 1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\time.inl(112):参见“localtime”的声明 我曾尝试将localtime更改为localtime\s,但收到一些关于与类型为“tm”的参数兼容的错误消息 我也尝试过(包括或wright)\uuuu CRT\u SECURE\u NO\u警告,但没有成功->我不知道,但仅仅包括这一行似乎很奇怪(在属性>c++>预处理器>未定义的预处理器定义中),而没有添加任何其他内容 承认我对VisualStudio不太熟悉,所以我不确定所有这些属性的设置和调整 但如果有人能帮我解决这个问题,我会非常感激,我想这是我唯一的错误,我会在以后调试C++ 在C+中实现时间的错误代码+;,c++,time,C++,Time,这是我的一个函数的实现,它可以查找时间、日期等,。。。。等等 我不知道为什么,但我得到了一个错误: 1> c:\users\sebastien\blabla:警告C4244:“参数”:从“time\t”转换为“unsigned int”,可能会丢失数据 1> DateHeure.cpp 1> c:\users\sebastien\blabla->错误C4996:“localtime”:此函数或变量可能不安全。考虑使用LoalTimeTys代替。要禁用弃用,请使用_CRT\u SECURE\u N
请包括一些关于为什么。。。我想理解。C4996不应该是一个错误,我想您已经调整了编译选项使其成为一个错误。(或 无论如何,不使用静态本地缓冲区的替代函数更好,而且它们也是可移植的(除了名称,在Win32上是
localtime\u s
,在Linux上是localtime\r
,宏可以修复),所以没有理由不使用它们
没有静态本地缓冲区的版本要求您提供一个缓冲区,这很容易:
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
heure_= timeinfo->tm_hour;
minute_ = timeinfo->tm_min;
seconde_ = timeinfo->tm_sec;
jourMois_ = timeinfo->tm_mday;
jourSemaine_ = timeinfo->tm_wday;
mois_ = timeinfo->tm_mon;
annee_ = timeinfo->tm_year;
C4996不应该是一个错误,我想您调整了编译选项使其成为一个错误。(或 无论如何,不使用静态本地缓冲区的替代函数更好,而且它们也是可移植的(除了名称,在Win32上是
localtime\u s
,在Linux上是localtime\r
,宏可以修复),所以没有理由不使用它们
没有静态本地缓冲区的版本要求您提供一个缓冲区,这很容易:
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
heure_= timeinfo->tm_hour;
minute_ = timeinfo->tm_min;
seconde_ = timeinfo->tm_sec;
jourMois_ = timeinfo->tm_mday;
jourSemaine_ = timeinfo->tm_wday;
mois_ = timeinfo->tm_mon;
annee_ = timeinfo->tm_year;
localtime
函数可能不安全,因为它返回的指针指向用于自身和其他调用的结构。这意味着,如果调用一个函数来更改该内部结构,那么指向它的所有指针都将反映新数据
如果您知道,如果您可以确保数据在使用完毕之前不会被修改,那么您仍然可以安全地使用它。在这种情况下,您可以这样做:
time_t rawtime;
struct tm timeinfo; // no longer a pointer
time(&rawtime);
// on platforms with POSIX localtime_r but no localtime_s, add this macro
// #define localtime_s(x, y) localtime_r(y, x)
localtime_s(&timeinfo, &rawtime); // fills in your structure,
// instead of returning a pointer to a static one
heure_= timeinfo.tm_hour; // no longer using a pointer
minute_ = timeinfo.tm_min;
seconde_ = timeinfo.tm_sec;
jourMois_ = timeinfo.tm_mday;
jourSemaine_ = timeinfo.tm_wday;
mois_ = timeinfo.tm_mon;
annee_ = timeinfo.tm_year;
#define _CRT_SECURE_NO_WARNINGS 1
#include <ctime>
#include <iostream>
int main()
{
time_t rawtime = time(nullptr);
tm* timeinfo = localtime(&rawtime);
std::cout << asctime(timeinfo) << "\n";
return 0;
}
请记住,
localtime\u s
可能无法在所有平台上使用,因此它的可移植性较差。localtime函数可能不安全,因为它返回的指针指向用于自身和其他调用的结构。这意味着,如果调用一个函数来更改该内部结构,那么指向它的所有指针都将反映新数据
如果您知道,如果您可以确保数据在使用完毕之前不会被修改,那么您仍然可以安全地使用它。在这种情况下,您可以这样做:
time_t rawtime;
struct tm timeinfo; // no longer a pointer
time(&rawtime);
// on platforms with POSIX localtime_r but no localtime_s, add this macro
// #define localtime_s(x, y) localtime_r(y, x)
localtime_s(&timeinfo, &rawtime); // fills in your structure,
// instead of returning a pointer to a static one
heure_= timeinfo.tm_hour; // no longer using a pointer
minute_ = timeinfo.tm_min;
seconde_ = timeinfo.tm_sec;
jourMois_ = timeinfo.tm_mday;
jourSemaine_ = timeinfo.tm_wday;
mois_ = timeinfo.tm_mon;
annee_ = timeinfo.tm_year;
#define _CRT_SECURE_NO_WARNINGS 1
#include <ctime>
#include <iostream>
int main()
{
time_t rawtime = time(nullptr);
tm* timeinfo = localtime(&rawtime);
std::cout << asctime(timeinfo) << "\n";
return 0;
}
<>记住
localtime\r
。。。因为静态本地缓冲区确实是个坏主意。除了名称之外,唯一的区别是localtime\r
切换两个参数。。。一个宏可以很容易地解决这个问题。这是真的,尽管如果它们支持C11,它们也可能有localtime\s
。嗯,两者都有。它名为localtime\u s
,但它返回的指针类似于posix版本,而不是Microsoft版本的错误代码。有点乱。ISO/IEC 9899:2011附录K.3.8.2.4中定义了struct tm*localtime\s()
的C11标准变体localtime\s(),struct tm*restrict result)代码>,与MSDN定义的errno\u t localtime(struct tm*\u tm,const time*time)相比代码>。另请参见,我以前不知道这组差异。@BenVoigt:C标准localtime\u s()
名称与POSIXlocaltime\r()具有相同的签名。微软对*.\u()
函数的实现是一成不变的(通过发布),并提交给了C标准委员会,该委员会做出了合理的修改,但由于MS已经发布了它们的变体,因此造成了损害。这是一个令人难以置信的混乱,而且确实非常不幸。其他重要的平台有localtime\r
。。。因为静态本地缓冲区确实是个坏主意。除了名称之外,唯一的区别是localtime\r
切换两个参数。。。一个宏可以很容易地解决这个问题。这是真的,尽管如果它们支持C11,它们也可能有localtime\s
。嗯,两者都有。它的名字是