这两个功能有什么区别?我正在使用 MinGW 4.8.0。
我知道这gmtime_r
是线程安全的(但如果从同一个线程多次调用则不安全)但我不明白gmtime_s
这两个功能有什么区别?我正在使用 MinGW 4.8.0。
我知道这gmtime_r
是线程安全的(但如果从同一个线程多次调用则不安全)但我不明白gmtime_s
不同的是,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 。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 */
};
gmtime_r
并且localtime_r
是标准的 POSIX 函数。
它们的主要目的是线程安全(可重入)。基本函数gmtime
和localtime
函数不是线程安全的或可重入的,因为它们使用单个静态区域来存储其结果,因此gmtime_r
并localtime_r
获取指向结果应存储位置的指针。
gmtime_s
并且localtime_s
由 Microsoft 引入,现在是 C11 的一部分,尽管非 Microsoft 支持是有限的。(有关进一步讨论,请参见此处。)
他们的主要目的是安全。它们是作为 Microsoft 的Secure CRT(安全 C 运行时)的一部分添加的。据我了解,线程安全不是微软 CRT 的问题,因为这些函数的静态输出区域已经分配给每个线程gmtime
。localtime
相反,gmtime_s
并被localtime_s
添加来执行 Secure CRT 的参数验证。(换句话说,他们检查他们的参数是否为 NULL,在这种情况下他们调用错误处理。)