Здравствуйте, Alekzander, Вы писали:
A>Как это записать в современном C++, чтобы не было performance penalty? Без конструирования контейнера и т.п. Нормальных макросов же (как в Немерле), насколько я понимаю, не завезли?
в с++23 можно так:
if (std::ranges::contains(std::array{
EAGAIN,
EWOULDBLOCK,
EINTR,
ENOSPC,
ENOBUFS,
ENOMEM
}, errno)) {
//
};
Здравствуйте, Alekzander, Вы писали:
Pzz>>Pzz>> if (errno == EAGAIN) {
Pzz>> errno = EWOULDBLOCK;
Pzz>> }
Pzz>>
A>Это будет трудноватенько обобщить. (Может, и к лучшему).
А для какой платформы?
На линухах, BSD и макоси это один и тот же код.
Для виндов есть только WSAEWOULDBLOCK, без WSAEAGAIN.
Если речь про сокеты, то исторически для записи чаще было EWOULDBLOCK (кроме неблокирующего connect, где ожидается готовность по записи), а для чтения EAGAIN (в т.ч. для неблокирующего accept), потом эти константы в POSIX допустили объединить.
Вдогонку, таблица кодов ошибок для различных систем:
https://www.ioplex.com/~miallen/errcmp.html
Трудновато там будет обобщить другое — код ошибки в случае неудачного connect, бо его надо добывать по-разному в разных системах.
А для семантики работы с сокетом лучше просто сравнить и с EWOULDBLOCK и с EAGAIN, т.к. компилятор лишнее сравнение выкинет, если коды одинаковые.