私は、私のブーストasioソケット通信内で何かをデバッグしようとしています。私はすでにC/C++開発の年の多くを持ってBoost :: asioこのような奇妙なコーディングスタイルは何ですか?
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_));
}
:(ブースト/ ASIO/IMPL/write.hppライン169(1.47を高める)で見つかった)ASIOライブラリ内のコードのこの部分を発見し、私の人生では決してこのような奇妙な実装を見たことはありません。そこを見ると、switch文のdefault:ラベルはforループ内にあります。
私がこの権利を理解していれば、switch文はgotoの代わりに誤って使用されます(start!= 1、goto defaultの場合)? 標準に関して、実際に有効なC/C++ですか? 私は、たとえば、元のコードでは、forループの代わりに、
for(int i=0; i < 10; i++)
を置く場合はどうなりますか。ジャンプがデフォルトに実行された場合、 "i"は未定義になります:label?確かに私はここでデバッガを使用するかもしれませんが、これは私にとっては疑わしいものですが、これは異なるコンパイラのために異なる動作を生み出すことができると思います。
'for'ループのように見えます。それ自体は' goto'として使われます。 'break'が実行されないと、' return'のために 'default'ラベルの前に次の繰り返しが必ず終了します。かなり毛深いもの。 –