2011-11-09 6 views
8

私は、私のブースト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?確かに私はここでデバッガを使用するかもしれませんが、これは私にとっては疑わしいものですが、これは異なるコンパイラのために異なる動作を生み出すことができると思います。

+1

'for'ループのように見えます。それ自体は' goto'として使われます。 'break'が実行されないと、' return'のために 'default'ラベルの前に次の繰り返しが必ず終了します。かなり毛深いもの。 –

答えて

8

これはよく定義された有効なコードです。 switchは本当に誉れたgotoです。この構造体を巧みに使用するには、Duff's deviceをご覧ください。

forについては、それは正当なものではありません。ケースラベルへのジャンプは、初期化を通過できません。

+0

これは本当に明確に定義されていますか?私はダフがgotoの代わりにスイッチを誤用したことを意味します。彼は、このようなスイッチを使うことができるかどうか、これが良いか悪いかを知らないと主張しました。 – cgart

+0

私は、それが明確に定義されていないという一貫した議論をすることができると思いますが、より明確な議論は明確に定義されていると思います。これは 'goto'のためによく定義されていて、両方とも同じタイプの行き先にジャンプします。 (ケースとデフォルトは 'goto'のターゲットと同じようにステートメントラベルです。) –

関連する問題