जब मैं [[परित्याग]] का उपयोग करने पर भी GCC मुझे एक गिरावट के बारे में चेतावनी क्यों दे रहा हूं?


86

निम्नलिखित कोड के कोड में, मैं [[fallthrough]]C ++ 1z से मानक विशेषता का उपयोग दस्तावेज़ में करता हूं कि एक गिरावट की इच्छा है:

#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";
    ~~~~~~~~~~^~~~~~~~

क्यों?


33
और यहाँ मैं सोच रहा था कि आप सी ++ लोग संभवतः किसी भी बदसूरत चीज़ को नहीं बना सकते हैं!
स्नेकडॉक

3
@SnakeDoc: यह एक उपहार है!
डेडुप्लिकेटर

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

23
मैं करीबी वोटों से असहमत हूं। "साधारण टाइपोग्राफिक त्रुटि" कारण उन मामलों के लिए मौजूद है जहां ओपी की समस्या केवल इसलिए हुई क्योंकि कुछ गलती प्रश्न विवरण से संबंधित नहीं है और किसी और के लिए उपयोगी नहीं होगी। इस मामले में यह काफी संभावना है कि अन्य लोग उस स्थान पर अर्धविराम को भूल जाते हैं, एक ही त्रुटि प्राप्त करते हैं और एक समाधान की तलाश में इस प्रश्न को पाते हैं।
कोडइन्चोअस

14
मैं दृढ़ता से नापसंद करता हूं कि मेरी टिप्पणी को इस प्रश्न से हटा दिया गया था, इसलिए मैं इसे फिर से दोहराने के लिए मजबूर हूं - जबकि यह वास्तव में एक टाइपोग्राफिक त्रुटि है, यह बहुत संभावना है कि अन्य उपयोगकर्ता इसे दोहराएंगे, इसके लिए खोज करेंगे, और इस उत्तर के साथ इस प्रश्न को ढूंढेंगे। जैसे, यह एक अच्छा प्रश्न और अच्छा उत्तर दोनों है और खुले रहने के योग्य है।
बैरी

जवाबों:


105

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

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

[[fallthrough]]विशेषता एक खाली बयान (देखने के लिए लागू किया जा रहा है P0188R1 )। वर्तमान क्लैंग ट्रंक इस मामले में एक उपयोगी त्रुटि देता है :

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

अपडेट: कोडी ग्रे ने इस मुद्दे को जीसीसी टीम को सूचित किया


अर्धविराम के बिना विशेषता क्या लागू होती है, यह उल्लेख करना अच्छा होगा। मुझे लगता है कि यह अगले मामले के लिए है?
कोडइन्चौसोस

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; चूंकि यह एक खाली बयान के बाद नहीं है, इसलिए जीसीसी इसे अनदेखा करता है
म्यूज़िकमैन 523

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

@SnakeDoc जाहिरा तौर पर यह केवल स्टेटमेंट एट्रीब्यूट का एक विशेष मामला है, इसलिए पार्सर इसके माध्यम से अनुमति देता है, लेकिन गैर-खाली स्टेटमेंट पर लागू होने पर इसका कोई शब्दार्थ नहीं है। यदि आप चाहें तो इसे बग समझें और clangइसे ठीक कर लें।
बरमार

2
@CodesInChaos अर्धविराम के बिना, विशेषता लेबल के लिए उपयुक्त होगा।
टीसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.