MinGW上的localtime_r支持

localtime_r support on MinGW

本文关键字:支持 localtime 上的 MinGW      更新时间:2023-10-16

我正在处理一个Win32多线程C++项目,我想使用localtime_*线程安全替代localtime()

不幸的是,我必须使用MinGW编译器,并且localtime_s不能在Microsoft之外使用。

问题是localtime_r都不起作用:相关的代码片段是

#include <ctime>
...
string getCurrentTime()
{
    time_t t;
    time(&t);
    struct tm timeinfo;
    //localtime_s(&timeinfo, &t);
    localtime_r(&t, &timeinfo);
    char buf[128]; 
    strftime(buf, 128, "%d-%m-%Y %X", &timeinfo);
    return string(buf);
}
...

这是编译器输出:

error: 'localtime_r' was not declared in this scope

MinGW支持localtime_r吗?

如果没有,是否存在线程安全的替代方案?(不包括我不能使用的boost/QT/等)。


编辑:这是我的MinGW安装提供的<time.h>:http://pastebin.com/0CYBfMzg

MinGW支持localtime_r吗?

没有。

如果没有,是否存在线程安全的替代方案?(不包括我不能使用的boost/QT/etc)

mingw将在windows上使用本机localtime函数,这是线程安全的。(但它不是可重入的,所以要小心)。

我的快速解决方案:

#include <time.h>
#if defined(_MSC_VER)
#   define localtime_r(T,Tm) (localtime_s(Tm,T) ? NULL : Tm)
#endif

(受MinGW代码启发,搜索_POSIX_THREAD_SAFE_FUNCTIONS。)

尝试使用函数localtime而不是localtime_r:

time_t t;
struct tm *timeinfo;
time(&t);
timeinfo = localtime(&t);
printf ("%s", asctime(timeinfo));