Langage D build на пакете Windows tinyredis-2.1.1 Ошибка: неопределенный идентификатор `EWOULDBLOCK` dmd не выполнен с кодом выхода 1

Я пытаюсь построить проект D на моем компьютере с Windows. Это работает на 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); }
}

2 ответа

Это не переменная, это константа.

Простой ответ: он не был объявлен.

Но выглядит как "обязательный" в соответствии с MSDN для целей совместимости.

Проблема, однако, в то время как libc MSVC может поддерживать его, DMC, который по умолчанию (-m32), вероятно, не будет. В любом случае, это ошибка, о которой следует сообщать как зависимости, так и системе отслеживания ошибок D.

EWOULDBLOCK не определен в Windows (в core.stdc.errno), поэтому вам нужно обернуть эту проблемную часть кода в блок версии и правильно обработать Windows. На винде core.sys.windows.winsock2 определяет EWOULDBLOCK

Тем не менее std.socket модуль имеет вспомогательную функцию wouldHaveBlocked() это работает на Windows, как и ожидалось:

Что-то вроде следующего сделало бы:

if (wouldHaveBlocked()) {
  len = 0;
  errno = 0;
} else {
  throw new ConnectionException(format("A socket error occurred! errno: %s", errno));
}
Другие вопросы по тегам