19

这两个功能有什么区别?我正在使用 MinGW 4.8.0。

我知道这gmtime_r是线程安全的(但如果从同一个线程多次调用则不安全)但我不明白gmtime_s

4

2 回答 2

20

不同的是,gmtime_r(3)是一个标准的SUSv2函数gmtime_r()您可以在 Windows 环境中找到最接近的是gmtime_s(),它的参数颠倒了:

  • gmtime_r(const time_t*, struct tm*)
  • gmtime_s(struct tm*, const time_t*)

基本上,它们都将时间值转换为tm结构。gmtime_r然后返回一个指向这个结构的指针(或者NULL如果失败),如果成功则gmtime_s返回,如果失败则返回 a 。0errno_t

tm从上面列出的两个文档中可以看出,该结构具有以下主体:

struct tm {
    int tm_sec;         /* seconds */
    int tm_min;         /* minutes */
    int tm_hour;        /* hours */
    int tm_mday;        /* day of the month */
    int tm_mon;         /* month */
    int tm_year;        /* year */
    int tm_wday;        /* day of the week */
    int tm_yday;        /* day in the year */
    int tm_isdst;       /* daylight saving time */
};
于 2013-09-27T13:31:41.583 回答
11

gmtime_r并且localtime_r是标准的 POSIX 函数。

它们的主要目的是线程安全(可重入)。基本函数gmtimelocaltime函数不是线程安全的或可重入的,因为它们使用单​​个静态区域来存储其结果,因此gmtime_rlocaltime_r获取指向结果应存储位置的指针。

gmtime_s并且localtime_s由 Microsoft 引入,现在是 C11 的一部分,尽管非 Microsoft 支持是有限的。(有关进一步讨论,请参见此处。)

他们的主要目的是安全。它们是作为 Microsoft 的Secure CRT(安全 C 运行时)的一部分添加的。据我了解,线程安全不是微软 CRT 的问题,因为这些函数的静态输出区域已经分配给每个线程gmtimelocaltime相反,gmtime_s并被localtime_s添加来执行 Secure CRT 的参数验证。(换句话说,他们检查他们的参数是否为 NULL,在这种情况下他们调用错误处理。)

于 2013-09-27T14:06:21.323 回答