2014-10-05 3 views
8

मैं सी ++ सीख रहा हूं, और अच्छा कोड लिखने की कोशिश कर रहा हूं। मैं वर्तमान संकलक झंडे के एक lof, जैसेएक अच्छी सी ++ 11 शैली को लागू करने के लिए मुझे किस ध्वज का उपयोग करना चाहिए?

-Wextra -Wall -pedantic -Werror -Wfatal-errors -Wcast-qual -Wcast-align -Wconversion -Wdouble-promotion -Wfloat-equal -Wshadow -Wpointer-arith -Weffc++ -ansi -Wstrict-aliasing

उपयोग कर रहा हूँ मैं सिर्फ सीखा है कि कीवर्ड new और delete अब और सी ++ 11 में नहीं किया जाना चाहिए। हालांकि, जब मैं उनका उपयोग करता हूं तो मेरे पास कोई चेतावनी नहीं होती है।

क्या कोई अच्छा सी ++ 11 शैली सुनिश्चित करने के लिए उपयोग करने के लिए कुछ झंडे हैं?

+11

* मैंने अभी सीखा है कि सी ++ में अब और नए कीवर्ड का उपयोग नहीं किया जाना चाहिए 11. * आपने इसे कहां पढ़ा है? क्या आप वाकई इसे सही समझ गए हैं? आप कच्चे पॉइंटर्स का उपयोग करने के लिए निराश हैं जहां आपको बाद में रिसोर्स को मुक्त करने के बारे में चिंता करने की आवश्यकता होगी। आप वास्तव में 'नया' और 'हटाएं' का उपयोग करने से बच नहीं सकते हैं और ऐसा करने का कोई कारण नहीं है। आप 'std :: make_unique()' या 'std :: make_shared() 'जैसे कॉल के पीछे' new' का उपयोग करके छिपा सकते हैं, लेकिन दृश्यों के पीछे वे केवल 'नए' पर कॉल लपेटे गए हैं। – Mario

+7

@ मारियो: आधुनिक सी ++ को वास्तव में 'डिलीट' का उपयोग करने की ज़रूरत नहीं है, कई अनुप्रयोगों को इसे सीधे कॉल करके कभी भी सर्वश्रेष्ठ सेवा नहीं दी जाएगी (और शायद ही कभी 'नया' कहा जाता है)। आपको सवाल उठाने का अधिकार है कि ओपी का मुद्दा शुद्ध सिद्धांत है, लेकिन इन दिनों आवेदन कोड में 'हटाएं' एक लाल झंडा है। हालांकि, आधुनिक सी ++ में हेडर में इतने सारे लाइब्रेरी कोड होने के साथ, यह भी तथ्य है कि 'हटाएं' कंपाइलर में तब भी दिखाई दे सकता है जब उपयोगकर्ता ने इसे लिखा नहीं है। चेतावनियों के बारे में यह मुश्किल बात है - अधिकांश कंपाइलर "आपके" कोड और "उनके" कोड के बीच भेदभाव नहीं करते हैं। –

+0

@ मारियो बिंदु यह है कि * आपको * कभी भी उनका उपयोग नहीं करना चाहिए, कुछ लाइब्रेरी करता है। – o11c

उत्तर

5

सबसे पहले, आपको यह समझना होगा कि आपका कंपाइलर पूरी तरह से अच्छी शैली को लागू करने वाला नहीं है।

हालांकि, दो तकनीकों हैं जिनका उपयोग आप कंपाइलर के लिए सहायता में कर सकते हैं, आप अपनी शैली को लागू करते हैं: चेतावनियां (जिसे कमांड लाइन या प्रागम्स में पारित किया जा सकता है) और जहरीले प्रागमा।

हालांकि, प्रत्येक कंपाइलर संस्करण के साथ उपलब्ध चेतावनियों के सटीक सेट को प्रबंधित करना मुश्किल है, इसलिए मैंने a list of warnings बनाया। ध्यान दें कि क्लैंग के लिए समर्थन न्यूनतम है, इसकी चेतावनियां आम तौर पर अपने शानदार विपणन के बावजूद, जीसीसी के अभ्यास में कम होती हैं; इसके अलावा यह पता लगाना असंभव है कि आप किस प्रकार के क्लैंग का उपयोग कर रहे हैं जो आप बग के आसपास काम करने के लिए उपयोग कर रहे हैं (फीचर डिटेक्शन मैक्रोज़ बल्कि बेकार हैं)।

मैंने a list of poison भी बनाया।

इसके अतिरिक्त, मेरे पास कुछ मेकफ़ाइल जादू है जो सुनिश्चित करता है कि उपर्युक्त दो तकनीकों को प्रत्येक लागू फ़ाइल के साथ-साथ कुछ अन्य चेक करने पर भी लागू किया जाता है।

हालांकि, यह ध्यान दिया जाना चाहिए कि प्रत्येक एप्लिकेशन की अलग-अलग ज़रूरतें हैं, इसलिए इन शीर्षकों का उपयोग नहीं किया जाना चाहिए। उदाहरण के लिए, बहुत कम एप्लिकेशन std::string जैसे मैंने किया था।

+0

धन्यवाद, मुझे प्रज्ञा नहीं पता था, यह वही करता है जो मैं चाहता था! –

+0

जहरीला गतिशील_कास्ट आईएमएचओ का उपयोग करता है, इसके बजाय -फनो-आरटीआई का उपयोग करें। – Nils

+0

@Nils rtti 'dynamic_cast' से अधिक के लिए उपयोगी है। – o11c

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

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