Здравствуйте, BSOD, Вы писали:
A>>Как это записать в современном C++, чтобы не было performance penalty? Без конструирования контейнера и т.п. Нормальных макросов же (как в Немерле), насколько я понимаю, не завезли?
BSO>
BSO>switch(errno)
BSO> case EAGAIN:
BSO> case EWOULDBLOCK:
BSO> case EINTR:
BSO> case ENOSPC:
BSO> case ENOBUFS:
BSO> case ENOMEM:
BSO> {...}
BSO>
Выше написали, что при дублировании будет ошибка компиляции. А от себя добавлю, что ! выражать через default это верный способ сделать больше ошибок, а не меньше.
Здравствуйте, Dair, Вы писали:
D>Здравствуйте, Alekzander, Вы писали:
A>> if (!(errno == EAGAIN || EWOULDBLOCK || A>> errno == EINTR || errno == ENOSPC || A>> errno == ENOBUFS || errno == ENOMEM)) {
D>Коллеги выше красиво написали, но почему-то упустили тот факт, что EWOULDBLOCK не находится в списке значений, которые не должен принимать errno.
Этот фрагмент, как упоминается в исходной статье от студии PVS, содержит ошибку.
В исправленной версии там именно сравнение с errno.
Вот бы уменьшить число сравнений с помощью бинарного поиска в упорядоченном ряде значений.
Взять какой-нибудь constexpr set и вызвать метод contains().
Здравствуйте, BSOD, Вы писали:
BSO>switch(errno) BSO> case EAGAIN: BSO> case EWOULDBLOCK: BSO> case EINTR: BSO> case ENOSPC: BSO> case ENOBUFS: BSO> case ENOMEM: BSO> {...}
Тут есть одна проблемка: на большинстве систем коды EAGAIN и EWOULDBLOCK сейчас совпадают (такое вот легаси), но есть специфические, где они различны. При совпадении switch выдаёт ошибку.
Можно проверять препроцессором, но это ещё больше левых слов.
А в варианте с == проблемы не возникает
Здравствуйте, Sm0ke, Вы писали:
S>Вот бы уменьшить число сравнений с помощью бинарного поиска в упорядоченном ряде значений. S>Взять какой-нибудь constexpr set и вызвать метод contains().
C++ и так это способен оптимизировать до битовых полей, что бы сравнивать группами.