2012-11-23 23 views
5

如果您有Cygwin的GCC编译它把这个简单的程序字符串错误使用MinGW-W64

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

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

运行良好

$ gcc a.c 

$ ./a 
ERROR 116 Connection timed out 

如果你使用MinGW-W64 GCC编译它,它不会给适当的错误信息

$ i686-w64-mingw32-gcc a.c 

$ ./a 
ERROR 138 Unknown error 

如何让MinGW-w64发出正确的错误信息?

+1

关于'ETIMEDOUT'的一些额外花絮:至少我的MinGW安装中有一个将它定义为'10060'(与'WSAETIMEDOUT'相同),而不是'138',如果它尚未定义的话。我认为这是因为传统的'winsock.h'曾经这样做(但现在不再)。如果编译器的“cerrno”尚未定义它,Boost会将其定义为“9938” - 直到VS2010才开始在MSVC中开始。所以,我想说你甚至可以认为自己有点幸运,甚至可以让程序编译。 –

+0

@MichaelBurr - WinSock根据http://www.sockets.com/err_lst1.htm#WSAETIMEDOUT从伯克利套接字中借用了WSAETIMEDOUT(10060) –

回答

2

ETIMEDOUT似乎是ISO C标准errno.h的扩展名POSIX。 Cygwin比MinGW对POSIX有更好的支持。关于mingw32的ETIMEDOUT的错误报告已在2007中打开并关闭。

一种选择是使用GNU Portability Library(Gnulib)。它提供了一个类似POSIX的errno.hstrerror()/strerror_override()