2011-11-09 67 views
8

我即將在我的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++) 

,而不是爲循環原代碼,會發生什麼。如果在執行跳轉到默認值的情況下將「未定義」:標籤?當然我可以在這裏使用調試器,但是這對我來說似乎很可疑,我認爲這可能會對不同的編譯器產生不同的行爲。

+1

似乎'for'循環本身被用作'goto'。如果'break'沒有被執行,下一次迭代肯定會在'default'標籤之前因'return'而終止。相當多毛的東西。 –

回答

8

這是明確定義的有效代碼。 A switch確實是一個榮耀goto。對於這個構造的一些聰明的使用,看看Duff's device

至於你的for,這將是不合法的。跳轉到案例標籤不能跨越初始化。

+0

你確定這個確定嗎?我的意思是達夫濫用開關而不是轉到。他甚至爭辯說,他不知道這樣做是好還是壞,以便能夠使用這樣的開關。 – cgart

+0

我認爲你可以提出一個連貫的論點,認爲它沒有明確定義,但我認爲更強有力的論點是它是明確的。它爲goto定義的很好,並且它們都跳轉到相同類型的目的地。 (案例和默認是聲明標籤,就像'goto'的目標一樣。) –

相關問題