दिलचस्प पोस्ट
वेबफॉर्म्स UnobtrusiveValidationMode को 'jquery' के लिए एक ScriptResourceMapping की आवश्यकता है कृपया एक जेपीआरआरससोर्समैपिंग जेक्जरी (केस-संवेदी) नाम दें एक रेंज ऑब्जेक्ट दिया गया है, जब कोशिकाओं की एक श्रेणी में प्रत्येक सेल के माध्यम से लूप "जहां 1 = 1" स्टेटमेंट IOS 7 ऐप आइकन, आईओएस रखते हुए छवियां लॉन्च करें और नामकरण सम्मेलन 6 प्रतीक एंड्रॉइड कम्पास जो झुकाव और पिच के लिए क्षतिपूर्ति कर सकता है सी ++ में विषम कंटेनर कैसे CMake में "-l" (ell) संकलक ध्वज को जोड़ने के लिए कन्स्ट्रक्टर को कॉल करने के लिए C # प्रतिबिंब का उपयोग करना Mod_rewrite की छिपी हुई विशेषताओं IntelliJ और टोमट .. कैसे ..? सी ++ थ्रेड्स, std :: system_error – ऑपरेशन की अनुमति नहीं है? कर्ल से जेसन प्रतिक्रिया को पार्स करने के लिए क्या SHA परिवार कार्यों की तुलना में एमडी 5 हैश कम सीपीयू की गणना है? यूआईएलबल की एनथ लाइन से टेक्स्ट कैसे प्राप्त करें? ES6 – 'आवश्यकता' से 'आयात' में परिवर्तित करें

सी ++ हेडर में "नेमस्पेस का उपयोग करना"

हमारे सभी सी ++ पाठ्यक्रमों में, सभी शिक्षकों ने हमेशा using namespace std; ठीक इसके बाद #include .h फाइलों में शामिल है। ऐसा लगता है कि मुझे खतरनाक होने के बाद से दूसरे प्रोग्राम में उस शीर्षलेख को शामिल करके मुझे अपने कार्यक्रम में नामस्थान मिलेगा, शायद बिना किसी एहसास के, इरादे या चाहना (हेडर समावेशन बहुत गहराई से किया जा सकता है)।

तो मेरा सवाल दोगुना है: क्या मैं सही हूं कि using namespace करना हेडर फाइलों में नहीं किया जाना चाहिए, और / या इसे पूर्ववत करने का कोई तरीका है, जैसे कुछ:

 //header.h using namespace std { . . . } 

एक ही पंक्ति में एक और प्रश्न: शीर्षलेख फ़ाइल #include सभी शीर्षलेखों को #include करना चाहिए, जो कि इसी .cpp फ़ाइल की जरूरत है, केवल उन है जो कि हेडर परिभाषाओं के लिए आवश्यक हैं और .cpp फ़ाइल को छोड़ दें #include बाकी को #include करें, या कोई भी नहीं और सब कुछ घोषित करें इसे extern रूप की आवश्यकता है?
प्रश्न के पीछे तर्क ऊपर के समान है: मुझे आश्चर्य नहीं चाहिए, जब .h फाइलें भी शामिल हों।

इसके अलावा, अगर मैं सही हूँ, क्या यह एक आम गलती है? मेरा मतलब वास्तविक दुनिया में प्रोग्रामिंग और "वास्तविक" परियोजनाओं में है।

धन्यवाद।

वेब के समाधान से एकत्रित समाधान "सी ++ हेडर में "नेमस्पेस का उपयोग करना""

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

शीर्ष लेख में केवल हेडर शामिल होना चाहिए जिसमें उसे संकलित करने की आवश्यकता होती है। इसे लागू करने का एक आसान तरीका हमेशा किसी भी अन्य शीर्ष लेखों के पहले प्रत्येक स्रोत फ़ाइल का अपना हेडर पहली चीज़ के रूप में शामिल करना है यदि स्रोत स्व-निहित नहीं है तो स्रोत फ़ाइल संकलन करने में विफल हो जाएगी। कुछ मामलों में, उदाहरण के लिए लाइब्रेरी के भीतर क्रियान्वयन-विस्तार वर्गों का संदर्भ देने के लिए, आप #include बजाय अग्रेषण घोषणाओं का उपयोग कर सकते हैं क्योंकि आपके पास ऐसे अग्रेषित घोषित वर्ग की परिभाषा पर पूर्ण नियंत्रण है।

मुझे यकीन नहीं है कि मैं इसे आम कहता हूं, लेकिन यह निश्चित रूप से थोड़ी देर में दिखाया जाता है, आमतौर पर नए प्रोग्रामर द्वारा लिखा जाता है जो नकारात्मक परिणामों से अवगत नहीं होते हैं आम तौर पर जोखिम के बारे में थोड़ा सा शिक्षा किसी भी मुद्दे का ख्याल रखती है क्योंकि यह ठीक करने के लिए अपेक्षाकृत सरल है।

मद 59 में सुटर और एलेक्जेंड्रेस्को की "सी ++ कोडिंग मानदंड: 101 नियम, दिशानिर्देश, और सर्वोत्तम प्रथा":

  1. एक हेडर फ़ाइल में या # शामिल होने से पहले नामस्थान का नाम लिखना न दें। 108

सभी दिशानिर्देशों के शीर्षक http://www.gotw.ca/publications/c++cs.htm पर हैं , लेकिन विवरण सी-डेवलपर्स के लिए पढ़ना आवश्यक है।

हेडर के अंदर हेडर शामिल होने पर आपको सावधान रहना होगा। बड़ी परियोजनाओं में, यह एक बहुत ही परेशान निर्भरता श्रृंखला बना सकती है जो वास्तव में आवश्यक से बड़ा / अधिक पुनर्निर्माण करता है सी ++ प्रोजेक्ट्स में अच्छे भौतिक संरचना के महत्व के बारे में अधिक जानने के लिए इस आलेख और इसके अनुवर्ती देखें ।

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

नामस्थानों के लिए, मैं अपनी हेडर फाइलों में स्पष्ट नेमस्पेस स्कोपिंग का उपयोग करते हैं, और केवल मेरी सीपीपी फाइलों में using namespace रखता हूं।

गोदार्ड स्पेस फ्लाइट सेंटर कोडिंग मानक (सी और सी ++ के लिए) देखें यह थोड़ा कठिन हो जाता है जितना कि इसका इस्तेमाल होता है – ऐसे सवालों के अपडेट किए गए उत्तर देखें:

  • क्या मैं # शामिल हेडर में शामिल करना चाहिए
  • सी और सी ++ में स्व-पर्याप्त हेडर

जीएसएफसी सी ++ कोडिंग मानक कहते हैं:

§3.3.7 प्रत्येक हेडर फाइल #include उन फ़ाइलों को #include करेगी जिन्हें संकलित करने की आवश्यकता है, उपयोगकर्ताओं को #include को आवश्यक फाइलों को #include करने के बजाय मजबूर करने के लिए। #includes शीर्षलेख की आवश्यकता के लिए सीमित होगा; अन्य #includes स्रोत फ़ाइल में रखा जाना चाहिए।

क्रॉस-संदर्भित प्रश्नों के पहले में अब जीएसएफसी सी कोडन मानक और उद्धरण से एक उद्धरण शामिल है, लेकिन पदार्थ एक ही होने पर समाप्त होता है

आप सही हैं कि हेडर में using namespace खतरनाक है। मुझे यह नहीं पता कि कैसे इसे पूर्ववत करें यह पता लगाना आसान है, लेकिन केवल हेडर फाइलों में using namespace लिए खोज करें। उस अंतिम कारण के लिए यह असली परियोजनाओं में असामान्य है अधिक अनुभवी सहकर्मी जल्द ही शिकायत करेंगे अगर कोई ऐसा कुछ करता है।

असली परियोजनाओं में लोगों को शामिल फ़ाइलों की मात्रा को कम करने की कोशिश करते हैं, क्योंकि जितना कम होता है उतना तेज़ी से यह संकलित होता है। यह सभी के समय बचाता है हालांकि, यदि हैडर फ़ाइल मानती है कि इससे पहले कुछ भी शामिल किया जाना चाहिए, तो इसमें स्वयं शामिल होना चाहिए अन्यथा यह शीर्ष लेख स्वयं को निहित नहीं बनाता है

तुम सही हो। और किसी भी फ़ाइल में उस फ़ाइल के लिए आवश्यक हेडर शामिल होना चाहिए। के लिए के रूप में "असली दुनिया परियोजनाओं में आम गलत बातें कर रही है?" – अरे हाँ!

प्रोग्रामिंग में सभी चीजों की तरह, व्यावहारिकता को गमवाद पर जीतना चाहिए, आईएमओ।

जब तक आप निर्णय परियोजना चौड़ा बनाते हैं ("हमारा प्रोजेक्ट बड़े पैमाने पर एसटीएल का उपयोग करता है, और हम std :: के साथ सब कुछ शामिल करना नहीं चाहते हैं।"), मुझे इसके साथ समस्या दिखाई नहीं दे रही है केवल एक चीज जो आप खतरे में डाल रहे हैं वह नाम टकराव है, सब के बाद, और एसटीएल की सर्वव्यापीता के साथ यह एक समस्या होने की संभावना नहीं है।

दूसरी तरफ, अगर एक एकल (गैर-निजी) हैडर-फ़ाइल में एक डेवलपर का यह निर्णय था, तो मैं देख सकता हूं कि यह टीम के बीच भ्रम पैदा कैसे करेगा और इसे टाल जाना चाहिए।

मेरा मानना ​​है कि आप सी ++ हेडर में 'का उपयोग' सुरक्षित रूप से उपयोग कर सकते हैं यदि आप ने इस तरह की नेस्टेड नामस्थान में अपनी घोषणाएं लिखी हैं:

 namespace DECLARATIONS_WITH_NAMESPACES_USED_INCLUDED { /*using statements*/ namespace DECLARATIONS_WITH_NO_NAMESPACES_USED_INCLUDED { /*declarations*/ } } using namespace DECLARATIONS_WITH_NAMESPACES_USED_INCLUDED::DECLARATIONS_WITH_NO_NAMESPACES_USED_INCLUDED; 

इसका इस्तेमाल केवल नामकरण के बिना 'DECLARATIONS_WITH_NO_NAMESPACES_USED_INCLUDED' में घोषित चीज़ों को शामिल करना चाहिए। मैंने इसे mingw64 कंपाइलर पर परीक्षण किया है

के संबंध में "क्या [ using घोषणा] को पूर्ववत करने का कोई तरीका है?"

मुझे लगता है कि यह इंगित करने के लिए उपयोगी है कि घोषणाओं using गुंजाइश से प्रभावित होता है।

 #include <vector> { // begin a new scope with { using namespace std; vector myVector; // std::vector is used } // end the scope with } vector myOtherVector; // error vector undefined std::vector mySTDVector // no error std::vector is fully qualified 

तो प्रभावी रूप से हाँ घोषणा के दायरे को सीमित using इसका प्रभाव केवल उस दायरे में रहता है; जब यह गुंजाइश समाप्त होता है, तब यह 'पूर्ववत' है

जब किसी भी अन्य दायरे के बाहर फ़ाइल में घोषित घोषणा का घोषित किया गया है, तो उसमें फ़ाइल-स्कोप होता है और उस फ़ाइल में हर चीज को प्रभावित करता है

हेडर फ़ाइल के मामले में, यदि using घोषणा फ़ाइल-क्षेत्र में है, तो यह किसी भी फ़ाइल के दायरे तक बढ़ेगा जिसमें हेडर शामिल होगा।