2012-11-23 9 views
5

Weź ten prosty programstrerror z MinGW-W64

#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

int 
main (void) 
{ 
    printf ("ERROR %d %s\n", ETIMEDOUT, strerror (ETIMEDOUT)); 
    return 0; 
} 

Jeśli skompilować go z Cygwin GCC działa poprawnie

$ gcc a.c 

$ ./a 
ERROR 116 Connection timed out 

Jeśli skompilować go z MinGW-W64 gcc nie daje właściwego komunikat o błędzie

$ i686-w64-mingw32-gcc a.c 

$ ./a 
ERROR 138 Unknown error 

W jaki sposób uzyskać komunikat o błędzie MinGW-w64?

+1

Kilka dodatkowych ciekawostek dotyczących "ETIMEDOUT": co najmniej jedna z moich instalacji MinGW definiuje go jako '10060' (taki sam jak" WSAETIMEDOUT ") zamiast" 138 ", jeśli nie jest jeszcze zdefiniowany. Myślę, że dzieje się tak dlatego, że dawny 'winsock.h' kiedyś to robił (ale już go nie ma). Boost zdefiniuje go jako '9938', jeśli' cerrno' kompilatora jeszcze go nie definiuje - co nie zaczęło się dziać w MSVC aż do VS2010. Powiedziałbym więc, że możesz uważać się za odrobinę szczęścia, nawet jeśli masz program do kompilacji. –

+0

@MichaelBurr - WinSock pożyczył WSAETIMEDOUT (10060) z Berkeley Sockets zgodnie z http://www.sockets.com/err_lst1.htm#WSAETIMEDOUT –

Odpowiedz

2

ETIMEDOUT wydaje się być rozszerzeniem POSIX do standardu ISO C errno.h. Cygwin ma lepszą obsługę POSIX niż MinGW. Raport o błędzie o ETIMEDOUT dla mingw32 został otwarty i zamknięty w 2007.

Jedną z opcji jest użycie biblioteki przenośności GNU (Gnulib). Zapewnia on podobne do POSIX-owe modele: errno.h i strerror()/strerror_override().