2017-07-11 16 views
70

, bir fallthrough arzu edilir belge C++ 1Z standart [[fallthrough]] özniteliği: GCC 7.1 ile[[fallthrough]] kullanıldığında bile GCC neden bir düşüş hakkında uyarı veriyor? aşağıdaki kod parçası olarak

#include <iostream> 

int main() { 
    switch (0) { 
     case 0: 
      std::cout << "a\n"; 
      [[fallthrough]] 
     case 1: 
      std::cout << "b\n"; 
      break; 
    } 
} 

, kod, bir hata derler. Ancak, derleyici hala beni bir uyarı hakkında uyarır:

warning: this statement may fall through [-Wimplicit-fallthrough=] 
    std::cout << "a\n"; 
    ~~~~~~~~~~^~~~~~~~ 

Neden?

+26

Ve işte ben seni düşünürdüm, C++ milletleri bir şeyleri çirkinleştiremezdi! – SnakeDoc

+3

@SnakeDoc: Bu bir hediye! – Deduplicator

+3

@SnakeDoc Cevap üzerinde bir yorum olmalı, bu da daha da kötüye gidiyor. :) – hvd

cevap

90

Sen niteliğinden sonra noktalı virgül eksik:

case 0: 
    std::cout << "a\n"; 
    [[fallthrough]]; 
    //   ^
case 1: 

[[fallthrough]] nitelik (P0188R1 bakınız) boş bir açıklamaya uygulanacak olmaktır. Geçerli Clang gövde gives a helpful error in this case:

error: fallthrough attribute is only allowed on empty statements 
    [[fallthrough]] 
    ^
note: did you forget ';'? 
    [[fallthrough]] 
       ^
        ; 

Güncelleme: Cody Gri reported GCC ekibine bu sorunu.

+0

Belirtilen özniteliğin noktalı virgül olmadan uygulanabileceğini söylemek güzel olurdu. Bir sonraki dava için var mı? – CodesInChaos

+2

@CodesInChaos 'fallthrough özniteliğine yalnızca boş bildirimlerde izin verilir'; boş bir ifade ile takip edilmediğinden, gcc bunu göz ardı eder – musicman523

+2

@ musicman523 Bu ... yanlış görünüyor mu? Görünüşe göre, boş bir ifade ile izlendiğinde bile bir noktalı virgül gerektirecek daha aklı olacak ve sadece başka bir şekilde derlemeyi reddedecektir. – SnakeDoc

İlgili konular