2

我正在尝试在我的 Windows 机器上构建一个 D 项目。它适用于mac,但在Windows中构建时出现以下错误,我在项目中使用命令“dub”并在某个时候得到它:

C:\Users\USER\AppData\Local\dub\packages\tinyredis-2.1.1\tinyredis\source\tinyredis\connection.d(145,30): Error: undefined identifier `EWOULDBLOCK`
dmd failed with exit code 1.      

任何想法为什么这个 EWOULDBLOCK 变量在 Windows 上无法识别?

这是出现此标识符的 connection.d 部分:

private :

void receive(TcpSocket conn, ref byte[] buffer)
{
    byte[1024 * 16] buff;
    size_t len = conn.receive(buff);

    if (conn.blocking)
    {
        if(len == 0)
            throw new ConnectionException("Server closed the connection!");
        else if(len == TcpSocket.ERROR)
            throw new ConnectionException("A socket error occurred!");
    }
    else
    {
        if (len == -1)
        {
            import core.stdc.errno;

            if (errno == EWOULDBLOCK)
            {
                len = 0;
                errno = 0;
            }
            else
                throw new ConnectionException(format("A socket error occurred! errno: %s", errno));
        }
    }

    buffer ~= buff[0 .. len];
    debug(tinyredis) { writeln("Response : ", "'" ~ escape(cast(string)buffer) ~ "'", " Length : ", len); }
}
4

2 回答 2

0

EWOULDBLOCK 未在 Windows 上定义(在 core.stdc.errno 中),因此您需要将有问题的代码部分包装在版本块中并正确处理 Windows。在 Windows 上core.sys.windows.winsock2定义 EWOULDBLOCK

但是,该模块有一个可以在 Windows 上按预期工作std.socket的辅助函数:wouldHaveBlocked()

像下面这样的事情会做:

if (wouldHaveBlocked()) {
  len = 0;
  errno = 0;
} else {
  throw new ConnectionException(format("A socket error occurred! errno: %s", errno));
}
于 2018-07-12T09:40:48.140 回答
0

它不是一个变量,它是一个常数。

简单的答案是,它还没有被宣布。

但是出于兼容性目的,根据MSDN看起来是“必需的”。

然而问题是,虽然 MSVC 的 libc 可能支持它,但默认的 DMC (-m32) 可能不支持。无论哪种方式,这都是一个错误,应该向依赖项和 D 的错误跟踪器报告。

于 2018-07-12T09:30:58.787 回答