c++ सबस सी++ क्या मुझे प्रत्येक स्रोत फ़ाइल के लिए मानक पुस्तकालयों को शामिल करना है?




विश्व का सबसे बड़ा पुस्तकालय (4)

मैं इस समय थोड़ी उलझन में हूँ क्योंकि मैं अपनी परियोजनाओं में से एक में पहली बार कई स्रोत और हेडर फ़ाइलों को शामिल करने की योजना बना रहा हूं।
तो मैं सोच रहा हूं कि यह सही दृष्टिकोण होगा?
क्या मुझे हर स्रोत फ़ाइल में स्ट्रिंग हेडर शामिल करना है जो इसका सीधे उपयोग करता है?
और "stdafx.hpp" शीर्षलेख के बारे में क्या दृश्य सी ++ मुझे शामिल करना चाहता है?

क्या यह जाने का तरीका है?

main.cpp

#include "stdafx.hpp"
#include <string> //?
#include <stringLib1.h>
#include <stringLib2.h>
using std::string;

//use a windows.h function here
//use a stringLib1 function here
//use a stringLib2 function here

stringLib1.h

#include "stdafx.hpp"
#include <string>
using std::string;

class uselessClass1
{
public:
    string GetStringBack1(string myString);
};

stringLib1.cpp

#include "stdafx.hpp"

string uselessClass1::GetStringBack1(string myString) {
    return myString;
}

stringLib2.h

#include "stdafx.hpp"
#include <string>
using std::string;

class uselessClass2
{
public:
    string GetStringBack2(string myString);
};

stringLib2.cpp

#include "stdafx.hpp"

string uselessClass2::GetStringBack2(string myString) {
    return myString;
}

यदि precompiled हेडर वीएस में सक्षम है तो stdafx.h शीर्षलेख की आवश्यकता है। ( यह एक पढ़ें ) आपको केवल .cpp फ़ाइलों में stdafx.h को शामिल करने की आवश्यकता है, जैसा कि पहले शामिल है।

हेडर और सीपीपी फाइलों (जो जोड़े में आते हैं) के बारे में, हेडर में घोषणा के लिए आवश्यक चीजें शामिल करें, और सीपीपी में बाकी सब कुछ (परिभाषा के लिए आवश्यक) शामिल करें। इसके सीडीपी जोड़ी में इसी हेडर भी शामिल करें। और उपयोग में गार्ड शामिल हैं

myclass.h

#ifndef MYCLASS_H  // This is the include guard macro
#define MYCLASS_H

#include <string>
using namespace std;

class MyClass {
    private:
      string myString;
    public:
    MyClass(string s) {myString = s;}
    string getString(void) {return myString;}
    void generate();
}

myclass.cpp

#include <stdafx.h>  // VS: Precompiled Header
// Include the header pair
#include "myclass.h" // With this one <string> gets included too
// Other stuff used internally
#include <vector>
#include <iostream>

void MyClass::generate() {
    vector<string> myRandomStrings;
    ...
    cout << "Done\n";
}

#endif

फिर main(...) , आप केवल myclass.h और कॉल generate() कर सकते generate() फ़ंक्शन।


Stdafx में प्रत्येक .cpp फ़ाइल के शीर्ष पर होना चाहिए और यह .h फ़ाइलों में नहीं होना चाहिए। आप # string को stdafx.h में शामिल कर सकते हैं यदि आप इसे अन्य हर फ़ाइल में नहीं रखना चाहते हैं।


  1. एक अच्छा अभ्यास आमतौर पर केवल शामिल करने के लिए है जो आपके कोड प्रत्येक फ़ाइल में उपयोग करता है। इससे अन्य हेडर पर निर्भरता कम हो जाती है, और बड़ी परियोजनाओं पर, संकलन के समय को कम करता है (और यह भी पता चलता है कि किस पर निर्भर करता है)

  2. उपयोग में हैडर फाइलों में गार्ड शामिल हैं

  3. ग्लोबल नेमस्पेस को प्रदूषित करके सब कुछ आयात न करें, उदा

    using namespace std;

    बल्कि उस योग्यता का उपयोग करें जब आप इसकी आवश्यकता पड़ने पर इसका उपयोग करना चाहते हैं

  4. आपको अपनी प्रोजेक्ट में stdafx.h आवश्यकता नहीं है, जब तक कि आप प्रीकंपमेट किए गए हेडर का उपयोग नहीं कर रहे हैं । आप इस व्यवहार को वी.एस. प्रोजेक्ट प्रॉपर्टी ( सी / सी ++ -> प्रीकंपाइल्ड हेडर्स -> प्रीकंपाइल्ड हैडर में नियंत्रित कर सकते हैं)


मुझे लगता है कि आपको अपनी सीडी फ़ाइलें और हेडर फाइलों की आवश्यकता हो सकती है। जैसा आपने दिया था

#include <stringLib1.h>
#include <stringLib2.h>

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

इसलिए, एक सामान्य हेडर फाइल "include.h" पर विचार कर रहा है।

#ifndef INCLUDES_H
#define INCLUDES_H

#include <string>

#include <stringLib1.h>
#include <stringLib2.h>

/***Header files***/    

#endif  //INCLUDES_H

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





precompiled-headers