2011-11-09 22 views
8

Güçlendirme asio soket iletişimimde hata ayıklamak üzereyim. Ve asio kütüphanenin içindeki kod parçası bulundu (/ asio/impl/write.hpp hattı 169() 1.47 artırmak boost bulunan):Boost :: asio bu tür garip kodlama stili nedir?

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_)); 
    } 

Zaten C/C++ geliştirme yıl çok şey var deneyim, ama asla hayatımda hiç bu kadar garip bir uygulama gördüm. Oraya bakın, varsayılan: anahtar deyiminin etiketi for döngüsü içinde.

Bu hakkı anlıyorsam, anahtar deyimi bir goto yerine "yanlış kullanılır" (sağdaki (başlangıç! = 1, goto varsayılan :) durumları için)? Aslında standart olarak geçerli bir C/C++ mu? Ben mesela orijinal kodda döngü yerine

for(int i=0; i < 10; i++) 

koyarsanız ne olacak. Atlama varsayılan olarak yapılırken tanımlanamayacak mı? Etiket mi? Burada bir hata ayıklayıcı kullanabilirim, ancak bu benim için çok şüpheli görünüyor, bunun farklı derleyiciler için farklı davranışlar üretebileceğini düşünüyorum.

+1

'for' döngüsünün kendisi bir' goto 'olarak kullanılır. 'Break' çalıştırılmazsa, bir sonraki yineleme mutlaka 'return' nedeniyle 'default' etiketinden önce sonlanır. Oldukça kıllı şeyler. –

cevap

8

Bu iyi tanımlanmış, geçerli bir koddur. Bir switch, gerçekten bir goto yüceltilmiştir. Bu yapının akıllıca kullanılması için Duff's device'a bakın.

for'unuza gelince, bu yasal olmayacaktır. Bir vaka etiketine yapılan bir sıçrama, başlatmayı geçemez.

+0

Bunun gerçekten iyi tanımlandığından emin misiniz? Demek istediğim, Duff, goto yerine yanlış kullanıldı. Bunun gibi anahtarları kullanabilmenin iyi ya da kötü olup olmadığını bilmediğini bile iddia etti. – cgart

+0

Sanırım iyi tanımlanmayan tutarlı bir argüman yapabilirsin, ama bence güçlü argüman iyi tanımlanmış. 'Goto' için iyi tanımlanmış ve ikisi de aynı tür hedefe atlıyor. (Vakalar ve varsayılanlar, goto’nun hedefleri gibi, varsayılan etiketlerdir). –

İlgili konular