2017-07-11 23 views
70

कोड का निम्न भाग में, मैं दस्तावेज़ के लिए है कि एक fallthrough वांछित है सी ++ 1Z से मानक [[fallthrough]] विशेषता का उपयोग:जब मैं [[fallthrough]] का उपयोग करता हूं तब भी जीसीसी मुझे एक गिरावट के बारे में चेतावनी दे रहा है?

#include <iostream> 

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

जीसीसी 7.1 के साथ, कोड एक त्रुटि के बिना संकलित करता है। हालांकि, संकलक अभी भी मुझे गिरावट के बारे में चेतावनी देता है:

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

क्यों?

+26

और यहां मैं आपको सोच रहा था कि सी ++ लोग संभवतः चीजों को किसी भी प्रकार के काम नहीं कर पाएंगे! – SnakeDoc

+3

@ स्नैकडॉक: यह एक उपहार है! – Deduplicator

+3

@ स्नैकडॉक यह उत्तर पर एक टिप्पणी होना चाहिए, जो इसे और भी बदतर बनाता है। :) – hvd

उत्तर

90

आप विशेषता के बाद अर्धविराम याद कर रहे हैं:

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

[[fallthrough]] विशेषता एक खाली बयान करने के लिए लागू किया जा रहा है (P0188R1 देखें)। वर्तमान बजना ट्रंक gives a helpful error in this case:

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

अद्यतन: कोड़ी ग्रे reported जीसीसी टीम को इस समस्या।

+0

अर्धविराम के बिना विशेषता क्या लागू होती है यह उल्लेख करना अच्छा होगा। मुझे लगता है कि यह अगले मामले में है? – CodesInChaos

+2

@CodesInChaos 'fallthrough विशेषता केवल रिक्त बयान पर अनुमति है; चूंकि इसका खाली विवरण नहीं है, इसलिए जीसीसी बस इसे – musicman523

+2

@ musicman523 अनदेखा करता है ... ऐसा लगता है ... गलत? ऐसा लगता है कि, खाली वक्तव्य के बाद भी अर्धविराम की आवश्यकता होती है, और अन्यथा संकलित करने से इंकार कर दिया जाता है। – SnakeDoc

संबंधित मुद्दे

 संबंधित मुद्दे