【问题标题】:how to use localtime_s with a pointer in c++如何在 C++ 中使用带有指针的 localtime_s
【发布时间】:2016-02-07 19:52:56
【问题描述】:

我正在使用 C++ 中的一个函数来帮助获取月份的整数。我进行了一些搜索,发现一个使用本地时间但我不想设置它来删除警告,所以我需要使用localtime_s。但是当我使用它时,我的指针不再起作用,我需要有人帮我找到指针缺少的东西。

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <Windows.h>
#include "FolderTask.h"
#include <ctime> //used for getMonth
#include <string>
#include <fstream>

int getMonth()
{
    struct tm newtime;
    time_t now = time(0);
    tm *ltm = localtime_s(&newtime,&now);
    int Month = 1 + ltm->tm_mon;
    return Month;
}

我得到的错误是:

错误 C2440:“正在初始化”:无法从“errno_t”转换为“tm *” 注意:从整数类型转换为指针类型需要 reinterpret_cast、C 风格转换或函数风格转换

【问题讨论】:

标签: c++ pointers localtime


【解决方案1】:

看起来您正在使用 Visual C++,所以 localtime_s(&amp;newtime,&amp;now); 用您想要的数字填充 newtime 结构。与常规的localtime 函数不同,localtime_s 返回错误代码。

所以这是一个固定版本的函数:

int getMonth()
{
    struct tm newtime;
    time_t now = time(0);
    localtime_s(&newtime,&now);
    int Month = 1 + newtime.tm_mon;
    return Month;
}

【讨论】:

  • 谢谢你,这正是我所需要的。我没有依赖带有所需信息的指针变成了新的并且无法理解。
  • 如果你忽略了错误结果,你最好不要打扰_s版本。
  • 非 _s 版本返回一个指向 C 运行时静态缓冲区的指针,这有点糟糕。但是,Kevin 使用它的主要原因是摆脱 MSVC 的弃用警告,而不用大惊小怪_CRT_SECURE_NO_DEPRECATE 的定义。无论如何,localtime_s 返回的唯一错误条件是 EINVAL(无效参数)——因此用户必须传递垃圾参数才能看到这一点——你不会得到错误条件,因为运行时或操作系统让你感到惊讶您的控制,例如内存不足或其他情况。
  • 原则上同意,但我经常看到关于不安全方法的编译器警告(无论 MS 是否正确地标记 localtime)以保持代码同样不安全的方式被抑制,但是静态分析几乎不可能将其检测为不安全。我认为这是一种非常危险的做法,值得警告。
  • 非常有帮助——我最初并没有意识到 localtime_s 和 gmtime_s 与它们的 localtime/gmtime 对应物如此不同。
猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2020-03-21
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多