Я собираюсь отладить что-то в моем сокете boost asio И нашел этот фрагмент кода внутри библиотеки asio (находится в boost / asio / impl / write.hpp, строка 169 (boost 1.47)):
switch (start)
{
case 1:
buffers_.prepare(this->check_for_completion(ec, total_transferred_));
for (;;)
{
stream_.async_write_some(buffers_,
BOOST_ASIO_MOVE_CAST(write_op)(*this));
return;
default:
total_transferred_ += bytes_transferred;
buffers_.consume(bytes_transferred);
buffers_.prepare(this->check_for_completion(ec, total_transferred_));
if ((!ec && bytes_transferred == 0)
|| buffers_.begin() == buffers_.end())
break;
}
handler_(ec, static_cast<const std::size_t&>(total_transferred_));
}
У меня уже много лет опыта разработки C / C ++, но никогда в жизни я не видел такой странной реализации. Посмотрите, метка default: оператора switch находится внутри цикла for.
Если я правильно понимаю, тогда оператор switch "неправильно используется" вместо a goto, правильно (для случаев, когда start! = 1, goto default :)? Действительно ли это действительный C / C ++ по отношению к стандарту? Что произойдет, если я, например, поместите
for(int i=0; i < 10; i++)
вместо цикла for в исходном коде. Будет ли «i» неопределенным в случае, если выполняется переход по умолчанию: label? Конечно, я мог бы использовать здесь отладчик, однако это кажется мне настолько подозрительным, что я думаюэто может привести к разному поведению разных компиляторов.