这两个功能有什么区别?我正在使用MinGW 4.8.0。
我知道gmtime_r
是线程安全的(如果从同一个线程多次调用,则不安全)但我不明白gmtime_s
答案 0 :(得分:17)
区别在于gmtime_r(3)
是standard SUSv2 function。在Windows环境中,您可以找到距gmtime_r()
最近的gmtime_s()
,其参数相反:
gmtime_r(const time_t*, struct tm*)
gmtime_s(struct tm*, const time_t*)
基本上,它们都将时间值转换为tm
结构。 gmtime_r
然后返回指向此结构的指针(如果失败则返回NULL
),而gmtime_s
如果成功则返回0
,如果失败则返回errno_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 */
};
答案 1 :(得分:9)
gmtime_r
和localtime_r
是标准的POSIX函数。
他们的主要目的是线程安全(重入)。基本gmtime
和localtime
函数不是线程安全的或可重入的,因为它们使用单个静态区域来存储结果,因此gmtime_r
和localtime_r
指向应该存储结果的地方。
gmtime_s
和localtime_s
由Microsoft引入,现在是C11的一部分,尽管non-Microsoft support is limited。 (有关进一步的讨论,请参阅here。)
他们的主要目的是安全。它们是Microsoft的Secure CRT(安全C运行时)的一部分。据我所知,在Microsoft的CRT中,线程安全性不是问题gmtime
和localtime
,因为这些函数的静态输出区域已经为每个线程分配。相反,我添加了gmtime_s
和localtime_s
来执行安全CRT的parameter validation。 (换句话说,它们检查它们的参数是否为NULL,在这种情况下它们会调用错误处理。)