Re[15]: Ценность совместимости C++ с C
От: B0FEE664  
Дата: 30.07.24 16:04
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Хм, а в чем смысл наличия повторяющихся значений в цепочках сравнений, объединенных ||? Чтоб было более загадочно?

ЕМ>switch здесь как раз хорош тем, что будет ругаться на повторяющиеся значения, и тем наведет на мысль, что здесь что-то не так.
Смысл тут.
Автор: so5team
Дата: 17.06.23

Цитата:

то возникнет ошибка компиляции на платформах, где EAGAIN == EWOULDBLOCK. Тогда как на платформах, где это разные значения, все будет нормально.
При этом тупое сравнение (errno == EAGAIN || errno == EWOULDBLOCK || ...) будет нормально компилироваться всегда.


BFE>>
BFE>>constexpr auto arrErrs = std::array{EAGAIN, EWOULDBLOCK, EINTR, ENOSPC, ENOBUFS, ENOMEM};

BFE>>if ( std::ranges::contains(arrErrs, errno) )
BFE>>  ...
BFE>>

ЕМ>Перед использованием подобных конструкций я бы сперва посмотрел, в какой код они компилируются. Иначе легко можно нарваться на активное использование динамической памяти.
Да ну откуда тут может взяться динамическая память?
И каждый день — без права на ошибку...
Re[16]: Ценность совместимости C++ с C
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.07.24 16:48
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Да ну откуда тут может взяться динамическая память?


Верно. Забыл, что std::array статический. Я ж сам std не пользую.
Отредактировано 05.08.2024 16:15 Евгений Музыченко . Предыдущая версия .
Re[14]: Ценность совместимости C++ с C
От: Alekzander  
Дата: 05.08.24 13:09
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Кстати, есть ещё вариант C++23:


BFE>
BFE>constexpr auto arrErrs = std::array{EAGAIN, EWOULDBLOCK, EINTR, ENOSPC, ENOBUFS, ENOMEM};

BFE>if ( std::ranges::contains(arrErrs, errno) )
BFE>  ...
BFE>


Тут магия в том, что мы в contains передаём constexpr, и вместо вызова код будет развёрнут в сравнения, как и требуется по условиям задачи? Или я неправильно понимаю?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.