使用MinGW-w64中的strerror函数

6

请看这个简单的程序

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

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

如果您使用Cygwin gcc编译它,它可以正常运行。
$ 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 中发生。所以,我想说你可能会觉得自己很幸运,甚至可以编译程序。 - Michael Burr
@MichaelBurr - WinSock从伯克利套接字借用了WSAETIMEDOUT(10060),参考网址为http://www.sockets.com/err_lst1.htm#WSAETIMEDOUT。 - David L.
1个回答

2

ETIMEDOUT看起来是POSIX标准下的errno.h的拓展。Cygwin对于POSIX的支持比MinGW更好。有一份关于mingw32 ETIMEDOUT的bug报告在2007年被提出并关闭。

其中一个选择是使用GNU可移植性库(Gnulib)。它提供了类似POSIX的errno.hstrerror()/strerror_override()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接