VS2022S使用C语言获取系统时间、C4996编译器报错

文章讲述了在C++代码中遇到C4996编译器警告,提示使用`gmtime_s`替代`gmtime`以提高代码安全性。给出了在VisualStudio中关闭警告的两种方法,并展示了如何替换不安全的时间获取函数以避免潜在的安全问题。
摘要由CSDN通过智能技术生成

 获取系统时间:


#include <stdio.h>
#include <string.h>
#include <time.h>


void getlocaltime()
{
    time_t nowtime;
    struct tm timeinfo;
    time(&nowtime);
    localtime_s(&timeinfo, &nowtime);
    int year, month, day, hour, min, sec;
    year = 1900 + timeinfo.tm_year;
    month = 1 + timeinfo.tm_mon;
    day = timeinfo.tm_mday;
    hour = timeinfo.tm_hour;
    min = timeinfo.tm_min;
    sec = timeinfo.tm_sec;
    printf("系统时间:%4d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, min, sec);

}

int main(int argc, char *argv[])
{
   getlocaltime();
   return(0);
}

结果如下:

处理C4996编译器报错:

(严重性    代码    说明    项目    文件    行    禁止显示状态
错误    C4996    'gmtime': This function or variable may be unsafe. Consider using gmtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    获取系统时间    C:\Users\zzh\source\repos\获取系统时间\获取系统时间.c    40    
)

原因:

你的代码使用标记为“已弃用”的函数、类成员、变量或 typedef。 符号是使用 __declspec(deprecated) 修饰符或 C++14 [[deprecated]] 属性弃用的。 实际的 C4996 警告消息由声明的 deprecated 修饰符或属性指定。

不安全的 CRT 库函数

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Microsoft 弃用了一些 CRT 和 C++ 标准库函数与全局变量,因为有更安全的版本可用。 大多数已弃用的函数允许在不经过检查的情况下对缓冲区进行读取或写入访问。 滥用这些函数可能导致严重的安全问题。 编译器会发出对这些函数的弃用警告,并建议首选函数。

若要解决此问题,我们建议改用函数或变量 safe-version。 有时,出于可移植性或后向兼容性原因,你不能这样做。 请仔细验证你的代码中是否不允许发生缓冲区覆盖或过度读取。 然后可以关闭警告。

若要在 CRT 中关闭这些函数的弃用警告,请定义 _CRT_SECURE_NO_WARNINGS

若要关闭有关弃用的全局变量的警告,请定义 _CRT_SECURE_NO_WARNINGS_GLOBALS

有关这些已弃用函数和全局变量的详细信息,请参阅 CRT 中的安全功能安全库:C++ 标准库

处理办法1:

在 Visual Studio 中关闭针对项目的警告

若要关闭 Visual Studio IDE 中整个项目的警告,请执行以下操作:

  1. 打开项目的“属性页”对话框。 有关如何使用“属性页”对话框的信息,请参阅属性页

  2. 选择“配置属性”>“C/C++”>“高级”属性页。

  3. 编辑“禁用特定警告”属性以添加 4996。 选择“确定”以应用更改。

处理办法2:

还可以使用预处理器宏来关闭库中使用的弃用警告的某些特定类。 下面介绍了这些宏。

若要在 Visual Studio 中定义预处理器宏,请执行以下操作:

  1. 打开项目的“属性页”对话框。 有关如何使用“属性页”对话框的信息,请参阅属性页

  2. 展开“配置属性”>“C/C++”>“预处理器”。

  3. 在“预处理器定义”属性中,添加宏名称。 选择“确定” 进行保存,然后重新生成项目。

若要仅在特定的源文件中定义宏,请在包含头文件的任何行之前添加一行(例如 #define EXAMPLE_MACRO_NAME)。

#define _CRT_SECURE_NO_WARNINGS//处理办法2
#include <stdio.h>
#include <string.h>
#include <time.h>


void getlocaltime()
{

    //time_t nowtime;
    //struct tm timeinfo;
    //time(&nowtime);
    //localtime_s(&timeinfo, &nowtime);
    //int year, month, day, hour, min, sec;
    //year = 1900 + timeinfo.tm_year;
    //month = 1 + timeinfo.tm_mon;
    //day = timeinfo.tm_mday;
    //hour = timeinfo.tm_hour;
    //min = timeinfo.tm_min;
    //sec = timeinfo.tm_sec;
    //printf("系统时间:%4d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, min, sec);

    time_t timep;

    time(&timep); //获取从1970至今过了多少秒,存入time_t类型的timep
    printf("%s", ctime(&timep));//用ctime将秒数转化成字符串格式,输出:Thu Feb 28 14:14:17 2019

    return 0;
}


void getlocaltimensec()
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    char buff[100];
    strftime(buff, sizeof buff, "%D %T", gmtime(&ts.tv_sec));
    printf("Current time: %s.%09ld UTC\n", buff, ts.tv_nsec);

}

int main(int argc, char* argv[])
{
    getlocaltime();
    getlocaltimensec();
    return(0);
}

输出结果:

Wed Jan 31 23:16:21 2024
Current time: 01/31/24 15:16:21.417281000 UTC

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值