我即將在我的boost asio套接字通信中調試一些東西。發現這段代碼的ASIO庫的內部(在升壓發現/ ASIO/IMPL/write.hpp線169(提高1.47)):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_));
}
我已經很多年C/C++開發經驗,但從來沒有在我的生活中看到過這種奇怪的實現。看那裏,switch語句的默認:標籤在for循環中。
如果我理解這個權利,那麼switch語句是「誤用」而不是goto,對(對於start!= 1,goto default :)的情況? 對於標準,它實際上是一個有效的C/C++嗎? 如果我例如把
for(int i=0; i < 10; i++)
,而不是爲循環原代碼,會發生什麼。如果在執行跳轉到默認值的情況下將「未定義」:標籤?當然我可以在這裏使用調試器,但是這對我來說似乎很可疑,我認爲這可能會對不同的編譯器產生不同的行爲。
似乎'for'循環本身被用作'goto'。如果'break'沒有被執行,下一次迭代肯定會在'default'標籤之前因'return'而終止。相當多毛的東西。 –