2012-01-10 10 views
6

क्या gcc या clang स्विच स्टेटमेंट में अनुपलब्ध ब्रेक के बारे में चेतावनी देने का कोई तरीका है?स्विच स्टेटमेंट्स में लापता ब्रेक के बारे में gcc/clang को चेतावनी कैसे दें

विशेष रूप से, मैं लगभग हमेशा केस स्टेटमेंट को ब्रेक के साथ समाप्त करना चाहता हूं, और यह बहुत अच्छा होगा कि अगर मैं नहीं करता तो मैं शिकायतकर्ता को शिकायत कर सकता हूं। इससे भी बेहतर होगा अगर यह ब्रेक स्टेटमेंट या "// फॉल थ्रू" टिप्पणी की तलाश करेगा।

क्या कोई अलग समाधान है जिसका उपयोग लोगों को स्वयं को पेंच करने में मदद करने के लिए किया जाता है?

+0

संभावित डुप्लिकेट [मैं ब्रेक के बिना स्विच/केस स्टेटमेंट पर चेतावनी (या असफल) को जीसीसी कैसे बता सकता हूं?] (Http://stackoverflow.com/questions/7703358/how-can-i-tell-gcc -to-warn-or-fail-on-switch-case-statement-without-a-break) –

उत्तर

9
बजना ट्रंक के साथ

, -Wimplicit-fallthrough का उपयोग करें। यदि आप सी ++ 11 का उपयोग कर रहे हैं, तो जानबूझकर गिरावट को [[clang::fallthrough]]; कथन के साथ चिह्नित किया जा सकता है (अधिक जानकारी के लिए इस विशेषता के लिए the documentation देखें)। चेतावनी (अभी तक) 'पतन के माध्यम से' टिप्पणियों की जांच नहीं करती है। यह सुविधा क्लैंग की आगामी 3.1 रिलीज में नहीं होगी, लेकिन यह (शायद!) 3.2 में होगी।

संपादित करें: क्लैंग की विशेषता अब [[fallthrough]]; नाम के तहत सी ++ 17 का हिस्सा है।

+0

मुझे लगता है कि आपने अभी इस सुविधा को http://llvm.org/viewvc/llvm-project?view=rev&revision= में देखा है 156,086। धन्यवाद! और अलेक्जेंडर Kornienko के लिए धन्यवाद! – sligocki

+1

अलेक्जेंडर यहां सभी क्रेडिट का हकदार है, मैंने इसकी समीक्षा की थी। :) –

+1

सी ++ 17 में अब [[fallthrough]] विशेषता है। –

2

आप से पूछा है कि यह अगर यह या तो एक ब्रेक बयान या एक "// के माध्यम से गिर" टिप्पणी के लिए दिखेगा बहुत अच्छा होगा।

हेनरी स्पेंसर का Ten Commandments for C programmers का पहला याद रखें?

1. तू करोगे रन फाहा अक्सर

ऐसा लगता है कि तुम क्या जरूरत है पीसी-एक प्रकार का वृक्ष/flexelint है की तरह। यहाँ 616 चेतावनी है:

616 नियंत्रण मामले/डिफ़ॉल्ट में बहती है - यह एक मामला बयान या इसके बाद के संस्करण से एक डिफ़ॉल्ट बयान में गिर नियंत्रण के प्रवाह के लिए संभव है। क्या यह जानबूझकर था या प्रोग्रामर ब्रेक स्टेटमेंट डालने में भूल गया था? यदि यह जानबूझकर किया गया तो तुरंत बयान है कि के रूप में चिह्नित किया गया था से पहले एक टिप्पणी जगह:

case 'a': a = 0; 
    /* fall through */ 
case 'b': a++; 
संबंधित मुद्दे