在C ++中实现time_t的错误代码

时间:2015-03-16 02:03:52

标签: c++ time

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;

这是我查找时间,日期......等功能的实现。

我不知道为什么,但我得到了错误:

  

1> c:\ users \ sebastien \ blabla:警告C4244:'参数' :来自&time;< time_t' to' unsigned int',可能丢失数据

     

1> DateHeure.cpp

     

1以及c:\用户\的Sebastien \ blabla->错误C4996:' localtime':此函数或变量可能不安全。请考虑使用localtime_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助。

     

1> c:\ program files(x86)\ microsoft visual studio

     

12.0 \ vc \ include \ time.inl(112):查看' localtime'

的声明

我尝试将localtime更改为localtime_s但是我收到一些关于与#34; tm"类型的参数兼容的错误消息。

我也试过(包括或怀疑)__CRT_SECURE_NO_WARNINGS但没有成功 - >我不知道但只是包含这一行似乎很奇怪(在属性> c ++>预处理器>未定义的预处理器定义中)而不添加任何其他内容。

承认我对Visual Studio并不熟悉,所以我不确定所有这些属性的设置和调整。

但我真的很感激,如果有人可以帮助我解决这个问题,我认为这是我唯一的错误,我会在调试后确认。

请提供一些有关原因的信息......我想了解。

2 个答案:

答案 0 :(得分:3)

C4996不应该是一个错误,我想你调整了你的编译选项使其成为一个错误。 (或project wizard did

无论如何,不​​使用静态本地缓冲区的备用功能更好,并且它们也是可移植的(除了名称之外的所有内容,它在Win32和localtime_s上都是{ {1}}在Linux上,宏可以修复),所以没有理由不使用它们。

没有静态本地缓冲区的版本希望您提供缓冲区,这很容易:

localtime_r

答案 1 :(得分:1)

localtime函数可能不安全,因为它返回的指针指向用于自身和其他调用的结构。这意味着如果你调用一个改变内部结构的函数,所有指向它的指针都会反映新数据。

如果您知道如果可以确保在完成数据之前不会修改数据,您仍然可以安全地使用它。在这种情况下,你可以这样做:

#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_s来填充您传递的结构,而该结构不会意外更改,那么您可以像这样使用它:

#include <ctime>
#include <iostream>

int main()
{
    time_t rawtime = time(nullptr);
    tm timeinfo;
    errno_t error = localtime_s(&timeinfo, &rawtime);
    if(error != 0)
    {
        std::cerr << "localtime_s failed.\n";
        return -1;
    }

    std::cout << asctime(&timeinfo) << "\n";
    return 0;
}

请注意,localtime_s可能并非在所有平台上都可用,因此可能不太便携。