2013-08-31 35 views
6

Tôi đang làm việc trên một dự án đa nhiệm Win32 C++ và tôi muốn sử dụng một trong các tùy chọn thay thế an toàn chủ đề localtime_* an toàn cho localtime().localtime_r hỗ trợ trên MinGW

Rất tiếc, tôi phải sử dụng trình biên dịch MinGW và không thể sử dụng localtime_s bên ngoài nội dung của Microsoft.

Vấn đề là không phải localtime_r đang làm việc: đoạn mã liên quan là

#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); 
} 

... 

Đây là trình biên dịch ra:

error: 'localtime_r' was not declared in this scope 

có hỗ trợ MinGW localtime_r?

Nếu không, có tồn tại phương án thay thế an toàn không? (không bao gồm tăng/QT/etc mà tôi không thể sử dụng).


EDIT: đây là <time.h> cung cấp bởi cài đặt MinGW của tôi: http://pastebin.com/0CYBfMzg

+1

gì "' localtime_s' không thể được sử dụng bên ngoài Microsoft thứ" nghĩa là gì? MinGW nhắm mục tiêu msvcrt.dll và msvcrt.dll không xác định 'localtime_s' (được xuất dưới dạng' _localtime32_s' và '_localtime64_s', tương ứng với 32-bit và 64-bit' time_t'). Nếu nó không được khai báo bởi các tiêu đề thư viện MinGW, thì hãy tự khai báo nó và gọi nó. Xem các tiêu đề thư viện Visual C++ để khai báo. –

+0

@JamesMcNellis Nhiều nguồn nói rằng chỉ có thể được sử dụng với trình biên dịch microsoft. Tôi đã thử (bao gồm '') và biên dịch với g ++ tôi nhận được 'lỗi: 'localtime_s' không được khai báo trong phạm vi này'. Ví dụ: http://stackoverflow.com/questions/17085603/time-functions-in-mingw/17088374#17088374 – eang

+1

Tôi không biết "nhiều nguồn" này là gì, nhưng chúng sai. Nó không được khai báo bởi '', nó được khai báo bởi '' trong (cũ) Visual C++ SDK. Nếu nó không được khai báo bởi bản sao của bạn '' của MinGW, bạn cần tự khai báo nó. –

Trả lời

6

Does MinGW support localtime_r ?

số

If not, does exist a thread-safe alternative? (excluding boost/QT/etc that I can't use)

mingw sẽ sử dụng bản địa localtime chức năng trên cửa sổ, đó là chủ đề an toàn . (Nhưng nó không phải là reentrant, vì vậy xem ra cho rằng).

+0

Giải thích cách localtime() là luồng an toàn? – Keith4G

+0

@ Keith46 nó sử dụng các biến cục bộ luồng trong nội bộ. – nos

+0

Ooooh rất tiện lợi. Tôi không hiểu điều đó trong tài liệu. Các phiên bản POSIX sử dụng hình cầu tĩnh thay thế. – Keith4G

-2

Hãy thử sử dụng các chức năng localtime thay vì localtime_r:

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