这两个功能有什么区别?我正在使用 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 。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 */
};
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,在这种情况下他们调用错误处理。)