दिलचस्प पोस्ट
कैसे $ .jax () jquery के साथ एकाधिक डेटा भेजने के लिए एंड्रॉइड एमुलेटर दृश्य से बाहर है, मैं इसे कैसे स्थानांतरित कर सकता हूं? मैं पीडीबी के बिना स्टैक ट्रेस में लाइन नंबर कैसे जोड़ सकता हूं? कैसे सी # में घटनाओं को प्रेषित करने के लिए पैकेज प्रबंधक तक पहुंच नहीं सके। एंड्रॉइड एप्लिकेशन इंस्टॉल करते समय सिस्टम चल रहा है परिवर्तनीय उत्थापन दो सरणियों को PHP में कुंजी मान जोड़े के रूप में मिलाएं एंड्रॉइड में एक पीडीएफ कैसे पढ़ें JavaFX 2.2 स्रोत कोड कहां से डाउनलोड कर सकते हैं? जेएसएफ में कई निर्भर / कैस्केडिंग चुनिंदाऑनमेनू ड्रॉपडाउन सूचियां बनाएं उद्देश्य- C घोषणा के साथ वार्स ({…}) वॉली – JSONArrayRequest का उपयोग करके एक पोस्ट अनुरोध भेजा जा रहा है कितना समय तक एक बलवान शताब्दी एसएचए 512 हैश? (नमक प्रदान) स्वत: पूर्ण होने पर जावास्क्रिप्ट ऑनचेन ईवेंट क्यों नहीं आग लग रहा है? रेडक्स स्टोर में नेस्टेड डेटा अपडेट करना

सी / सी ++ फ़ाइल ऑर्डर / सर्वोत्तम प्रथाएं शामिल हैं

क्या कोई अनुशंसित आदेश है जिसमें फाइल को निर्दिष्ट करना चाहिए?

उदाहरण के लिए, सिस्टम फाइलें, एसटीएल और बूस्ट स्थानीय शामिल फाइलों के पहले या बाद में करते हैं?

क्या एक या दूसरे को चुनने का कोई विशेष कारण है? मैं मान रहा हूं कि फाइलों में उचित निर्भरता निर्दिष्ट है I

वेब के समाधान से एकत्रित समाधान "सी / सी ++ फ़ाइल ऑर्डर / सर्वोत्तम प्रथाएं शामिल हैं"

मुझे नहीं लगता कि कोई अनुशंसित आदेश है, जब तक कि यह संकलित हो! क्या परेशान है जब कुछ हेडर को दूसरे शीर्षकों को पहले शामिल करने की आवश्यकता होती है … यह हेडर के साथ एक समस्या है, इसमें शामिल होने के क्रम से नहीं।

मेरी निजी वरीयता स्थानीय से वैश्विक रूप से जाना है, प्रत्येक उपधारा वर्णमाला क्रम में, अर्थात्:

  1. एच फ़ाइल को इस सीपीपी फाइल के अनुरूप (यदि लागू हो)
  2. समान घटक से हेडर,
  3. अन्य घटकों से हेडर,
  4. सिस्टम शीर्षलेख

1 के लिए मेरा तर्क यह है कि यह साबित करना चाहिए कि प्रत्येक हेडर (जिसके लिए सीपीपी है) #include किए बिना किसी और चीज की आवश्यकता हो सकती है। और बाकी बस वहां से तार्किक रूप से प्रवाह लगता है।

ध्यान रखने की बड़ी बात यह है कि आपके हेडर को पहले शामिल किए जाने वाले अन्य शीर्षकों पर निर्भर नहीं होना चाहिए। इसका बीमा करने का एक तरीका यह है कि किसी अन्य शीर्षलेख से पहले आपके हेडर शामिल करें।

विशेष रूप से "सी ++ में सोच" में इसका उल्लेख है, लेको '' बड़े स्केल सी ++ सॉफ्टवेयर डिज़ाइन "को संदर्भित करता है:

बाहरी उपयोग की घोषणाओं या परिभाषाओं के बिना – एक घटक पर्स के .h फाइल को सुनिश्चित करने से अवगत उपयोग त्रुटियों को बचाया जा सकता है … .सी फ़ाइल की पहली पंक्ति के रूप में .h फाइल को शामिल करना सुनिश्चित करता है कि कोई महत्वपूर्ण टुकड़ा घटक के भौतिक इंटरफ़ेस के लिए आंतरिक जानकारी के लिए .h फाइल से गुम है (या, अगर वहाँ है, तो आप इसके बारे में जैसे ही आप .c फ़ाइल संकलन करने की कोशिश करते हैं)।

इसका अर्थ यह है कि निम्नलिखित क्रम में शामिल करें:

  1. इस कार्यान्वयन के लिए प्रोटोटाइप / इंटरफ़ेस शीर्षक (यानी,।। /। सीएच फाइल से संबंधित .h / .hh फ़ाइल)।
  2. एक ही परियोजना से अन्य हेडर, जैसा कि आवश्यक है
  3. अन्य गैर-मानक, गैर-सिस्टम लाइब्रेरीज़ (उदाहरण के लिए, क्यूटी, ईगेन, आदि) से हेडर।
  4. अन्य "लगभग-मानक" पुस्तकालयों के हेडर (उदाहरण के लिए, बूस्ट)
  5. मानक C ++ हेडर (उदाहरण के लिए, iostream, कार्यात्मक, आदि)
  6. मानक सी हेडर (उदाहरण के लिए, सीएसटीडीआईएनटी, डायरेन्ट एच, आदि)

यदि किसी भी हेडर में इस आदेश में शामिल होने के साथ कोई समस्या है, तो या तो उन्हें ठीक करें (यदि आपकी है) या उनका उपयोग न करें बॉयकॉट लाइब्रेरी जो स्वच्छ हेडर नहीं लिखते

Google की सी ++ शैली गाइड वास्तव में किसी भी औचित्य के साथ लगभग रिवर्स का तर्क देता है; मैं व्यक्तिगत रूप से Lakos दृष्टिकोण के पक्ष में करते हैं

मैं दो साधारण नियमों का पालन करता हूं जो बड़ी संख्या में समस्याओं से बचें:

  1. सभी हेडर (और वास्तव में किसी भी स्रोत फाइल) में उन्हें क्या शामिल होना चाहिए। उन्हें चीजों सहित अपने उपयोगकर्ताओं पर भरोसा नहीं करना चाहिए
  2. एक सहायक के रूप में, सभी शीर्षलेखों में गार्ड शामिल होना चाहिए ताकि वे उपरोक्त नियम 1 के अति-महत्वाकांक्षी आवेदन से कई बार शामिल न हों।

मैं इनके दिशानिर्देशों का भी पालन करता हूं:

  1. पहले विभाजित सिस्टम हेडर (stdio.h, आदि) में विभाजन रेखा के साथ।
  2. उन्हें तार्किक रूप से समूह बनाएं

दूसरे शब्दों में:

 #include <stdio.h> #include <string.h> #include "btree.h" #include "collect_hash.h" #include "collect_arraylist.h" #include "globals.h" 

हालांकि, दिशानिर्देश होने के नाते, यह एक व्यक्तिपरक चीज़ है दूसरी तरफ नियम, मैं कठोर रूप से लागू करता हूं, यहां तक ​​कि 'आवरण' हेडर फाइल प्रदान करने के मुद्दे पर गार्ड शामिल है और इसमें कुछ घृणित तृतीय-पक्ष डेवलपर मेरी दृष्टि की सदस्यता नहीं लेता है 🙂

मुझे पूरा यकीन है कि यह समझदार दुनिया में कहीं भी एक अनुशंसित अभ्यास नहीं है, लेकिन मैं लाइन सिस्टम को पसंद करता हूं, फ़ाइल नाम की लंबाई से, समान लंबाई के साथ एक समान रूप से सॉर्ट करता है। इस तरह:

 #include <set> #include <vector> #include <algorithm> #include <functional> 

मुझे लगता है कि अन्य लोगों के सामने अपने खुद के हेडर शामिल करना एक अच्छा विचार है, जिसमें आदेश-आदेश निर्भरता की शर्म से बचने के लिए।

दीवार पर अपना स्वयं का ईंट जोड़ने के लिए

  1. प्रत्येक हेडर को आत्मनिर्भर होना चाहिए, जिसे केवल तभी परीक्षण किया जा सकता है अगर इसमें पहले से कम से कम एक बार शामिल किया गया हो
  2. किसी को प्रतीकों (मैक्रो, प्रकार, इत्यादि) को शुरू करने से कोई गलती से तीसरे पक्ष के हेडर का अर्थ नहीं बदलना चाहिए

तो मैं आमतौर पर इस तरह से जाना:

 // myproject/src/example.cpp #include "myproject/example.h" #include <algorithm> #include <set> #include <vector> #include <3rdparty/foo.h> #include <3rdparty/bar.h> #include "myproject/another.h" #include "myproject/specific/bla.h" #include "detail/impl.h" 

अगले समूह से प्रत्येक समूह को रिक्त पंक्ति से विभाजित किया गया है:

  • इस सीपीपी फ़ाइल से संबंधित हेडर पहले (विवेक जांच)
  • सिस्टम शीर्षलेख
  • निर्भरता आदेश द्वारा आयोजित तीसरे पक्ष के हेडर
  • प्रोजेक्ट हेडर
  • परियोजना निजी हेडर

यह भी ध्यान रखें कि, प्रणाली शीर्षकों के अलावा, प्रत्येक फ़ाइल फ़ोल्डर में नाम स्थान के नाम पर है, सिर्फ इसलिए कि इस तरह उन्हें नीचे ट्रैक करना आसान है।

मेरा सुझाव है:

  1. आप निर्माण कर रहे हैं। सीसी मॉड्यूल के लिए शीर्ष लेख (यह सुनिश्चित करने में मदद करता है कि आपके प्रोजेक्ट में प्रत्येक शीर्ष लेख में आपके प्रोजेक्ट के अन्य हेडर पर असंपरित निर्भरता नहीं है।)
  2. सी सिस्टम फाइलें
  3. सी ++ सिस्टम फाइलें
  4. प्लेटफ़ॉर्म / ओएस / अन्य हेडर फाइलें (जैसे, win32, gtk, openGL)
  5. आपके प्रोजेक्ट की अन्य हेडर फाइलें

और निश्चित रूप से, प्रत्येक खंड के भीतर वर्णमाला क्रम, जहां संभव हो।

अपनी हेडर फाइलों में अनावश्यक #include करने से बचने के लिए हमेशा आगे की घोषणाएं का उपयोग करें

यह व्यक्तिपरक नहीं है सुनिश्चित करें कि आपके शीर्षलेख विशिष्ट आदेश में #include को #include किए जाने पर भरोसा नहीं करते हैं आप यह सुनिश्चित कर सकते हैं कि इससे कोई फर्क नहीं पड़ता कि आप किस क्रम में एसटीएल या बूस्ट हेडर शामिल करते हैं

सबसे पहले। सीपीपी से संबंधित हैडर शामिल हैं … दूसरे शब्दों में, source1.cpp में source1.h में कुछ भी शामिल source1.h से पहले शामिल होना चाहिए। एकमात्र अपवाद जो मैं सोच सकता हूँ कि जब एमएसवीसी पूर्व-संकलित हेडर्स के साथ प्रयोग किया जाता है, तो उस स्थिति में, आपको कुछ और से पहले stdafx.h को शामिल करने के लिए मजबूर किया जाता है।

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

उदाहरण:

source1.h

 class Class1 { Class2 c2; // a dependency which has not been forward declared }; 

source1.cpp

 #include "source1.h" // now compiler will alert you saying that Class2 is undefined // so you can forward declare Class2 within source1.h ... 

एमएसवीसी प्रयोक्ताओं: मैं पहले से संकलित हेडर का उपयोग करने के लिए जोरदार सुझाव देता हूं इसलिए, मानक #include हेडर्स (और अन्य हेडर्स जो कि कभी नहीं बदलते हैं) के लिए stdafx.h सभी #include निर्देशों को #include

कम से कम विशिष्ट करने के लिए सबसे विशिष्ट से शामिल करें, .cpp के लिए संबंधित .hpp से शुरू, अगर ऐसा कोई भी मौजूद है। इस तरह, हेडर फाइलों में किसी भी छुपी निर्भरताएं जो आत्मनिर्भर नहीं हैं, प्रकट होंगी।

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

सी / सी + + दुनिया में यह एक कठिन प्रश्न है, मानक से परे इतने सारे तत्वों के साथ

मुझे लगता है कि हेडर फ़ाइल ऑर्डर एक गंभीर समस्या नहीं है, जैसे कि यह संकलित होता है, जैसे स्क्वार्ट ने कहा।

मेरा विचार है: अगर उन सभी शीर्षकों में प्रतीकों का कोई विरोध नहीं है, तो कोई भी ऑर्डर ठीक है, और हेडर निर्भरता मुद्दे को बाद में फ्लेवेड के लिए # शामिल करके जोड़कर तय किया जा सकता है।

असली हेज तब उठता है जब कुछ शीर्ष लेख में इसकी कार्रवाई बदलती है (शीर्ष पर स्थितियों के मुताबिक)

उदाहरण के लिए, VS2005 में stddef.h में, यह है:

 #ifdef _WIN64 #define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) ) #else #define offsetof(s,m) (size_t)&(((s *)0)->m) #endif 

अब समस्या: अगर मेरे पास एक कस्टम शीर्षक ("कस्टम एच") है जिसे कई कंपलर के साथ उपयोग करने की आवश्यकता है, जिसमें कुछ पुराने लोगों को उनके सिस्टम शीर्ष offsetof में offsetof प्रदान नहीं किया गया है, तो मुझे अपने शीर्ष लेख में लिखना चाहिए:

 #ifndef offsetof #define offsetof(s,m) (size_t)&(((s *)0)->m) #endif 

और सभी सिस्टम शीर्षकों के बाद #include "custom.h" को #include "custom.h" को #include "custom.h" करने के लिए उपयोगकर्ता को बताना सुनिश्चित करें, अन्यथा, offsetof की लाइन में offsetof एक मैक्रो रीडेफिनीशन त्रुटि को लागू करेगा।

हम प्रार्थना करते हैं कि हमारे कैरियर में ऐसे किसी भी अधिक मामले को पूरा न करें।