खोज…


टिप्पणियों

C ++ में, C की तरह, C ++ कंपाइलर और संकलन प्रक्रिया C प्रीप्रोसेसर का उपयोग करता है। जीएनयू सी प्रीप्रोसेसर मैनुअल द्वारा निर्दिष्ट के रूप में, एक हेडर फ़ाइल को निम्नलिखित के रूप में परिभाषित किया गया है:

एक हेडर फ़ाइल सी डिक्लेरेशन और मैक्रो परिभाषाएँ (मैक्रोज़ देखें) वाली फ़ाइल है, जिसे कई स्रोत फ़ाइलों के बीच साझा किया जाना है। आप अपने प्रोग्राम में एक हेडर फ़ाइल के उपयोग का अनुरोध करते हैं, जिसमें C प्रीप्रोसेसिंग निर्देश '#include' शामिल है।

हेडर फाइलें दो उद्देश्यों की पूर्ति करती हैं।

  • सिस्टम हेडर फाइलें ऑपरेटिंग सिस्टम के कुछ हिस्सों को इंटरफेस घोषित करती हैं। आप उन्हें सिस्टम कॉल और लाइब्रेरी को आमंत्रित करने के लिए आवश्यक परिभाषाओं और घोषणाओं की आपूर्ति करने के लिए अपने कार्यक्रम में शामिल करते हैं।
  • आपकी स्वयं की हेडर फ़ाइलों में आपके प्रोग्राम की स्रोत फ़ाइलों के बीच इंटरफेस के लिए घोषणाएँ होती हैं। हर बार जब आपके पास संबंधित घोषणाओं और मैक्रो परिभाषाओं का एक समूह होता है, जिसमें से अधिकांश या कई अलग-अलग स्रोत फ़ाइलों में आवश्यक होते हैं, तो उनके लिए हेडर फ़ाइल बनाना एक अच्छा विचार है।

हालाँकि, सी प्रीप्रोसेसर के लिए, हेडर फ़ाइल स्रोत फ़ाइल से अलग नहीं है।

शीर्ष लेख / स्रोत फ़ाइल संगठन योजना इंटरफ़ेस और कार्यान्वयन के बीच अलगाव प्रदान करने के लिए विभिन्न सॉफ़्टवेयर परियोजनाओं द्वारा निर्धारित एक दृढ़ता से आयोजित और मानक सम्मेलन है।

यद्यपि यह औपचारिक रूप से C ++ मानक द्वारा लागू नहीं किया गया है, हेडर / स्रोत फ़ाइल सम्मेलन के बाद अत्यधिक अनुशंसित है, और, व्यवहार में, पहले से ही लगभग सर्वव्यापी है।

ध्यान दें कि हेडर फ़ाइलों को मॉड्यूल की आगामी विशेषता द्वारा एक परियोजना फ़ाइल संरचना सम्मेलन के रूप में प्रतिस्थापित किया जा सकता है, जिसे अभी भी लिखने के समय के रूप में भविष्य के C ++ मानक में शामिल किए जाने पर विचार किया जाना है (जैसे C ++ 20)।

मूल उदाहरण

निम्न उदाहरण में कोड का एक ब्लॉक होगा जो कि कई स्रोत फ़ाइलों में विभाजित किया जाना है, जैसा कि // filename टिप्पणियों द्वारा दर्शाया गया है।

स्रोत फ़ाइलें

// my_function.h

/* Note how this header contains only a declaration of a function.
 * Header functions usually do not define implementations for declarations
 * unless code must be further processed at compile time, as in templates.
 */

/* Also, usually header files include preprocessor guards so that every header
 * is never included twice.
 *
 * The guard is implemented by checking if a header-file unique preprocessor
 * token is defined, and only including the header if it hasn't been included
 * once before.
 */
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

// global_value and my_function() will be
// recognized as the same constructs if this header is included by different files.
const int global_value = 42;
int my_function();

#endif // MY_FUNCTION_H

// my_function.cpp

/* Note how the corresponding source file for the header includes the interface  
 * defined in the header so that the compiler is aware of what the source file is 
 * implementing.
 *
 * In this case, the source file requires knowledge of the global constant
 * global_value only defined in my_function.h. Without inclusion of the header
 * file, this source file would not compile.
 */
#include "my_function.h" // or #include "my_function.hpp"
int my_function() {
  return global_value; // return 42;
}

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

// main.cpp

#include <iostream>       // A C++ Standard Library header.
#include "my_function.h"  // A personal header

int main(int argc, char** argv) {
  std::cout << my_function() << std::endl;
  return 0;
}

संकलन प्रक्रिया

चूंकि हेडर फाइलें अक्सर एक संकलन प्रक्रिया वर्कफ़्लो का हिस्सा होती हैं, हेडर / स्रोत फ़ाइल कन्वेंशन का एक विशिष्ट संकलन प्रक्रिया आमतौर पर निम्नलिखित कार्य करेगी।

यह मानते हुए कि शीर्ष लेख फ़ाइल और स्रोत कोड फ़ाइल पहले से ही एक ही निर्देशिका में है, एक प्रोग्रामर निम्नलिखित कमांड निष्पादित करेगा:

g++ -c my_function.cpp       # Compiles the source file my_function.cpp
                             # --> object file my_function.o

g++ main.cpp my_function.o   # Links the object file containing the 
                             # implementation of int my_function()
                             # to the compiled, object version of main.cpp
                             # and then produces the final executable a.out

वैकल्पिक रूप से, यदि कोई main.cpp को पहले किसी ऑब्जेक्ट फ़ाइल में संकलित करना चाहता है, और फिर अंतिम चरण के रूप में केवल ऑब्जेक्ट फ़ाइलों को एक साथ लिंक करता है:

g++ -c my_function.cpp
g++ -c main.cpp

g++ main.o my_function.o

हैडर फ़ाइलों में टेम्पलेट

टेम्पलेट्स को कोड के संकलन-समय की आवश्यकता होती है: एक टेम्पर्ड फ़ंक्शन, उदाहरण के लिए, प्रभावी रूप से कई अलग-अलग कार्यों में बदल जाएगा, जब एक टेम्पर्ड फ़ंक्शन स्रोत कोड में उपयोग द्वारा मानकीकृत हो जाता है।

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

इस प्रकार, टेम्प्लेटेड कोड, यदि हेडर में रखा गया है, तो इसकी परिभाषा भी होनी चाहिए। इसका एक उदाहरण नीचे दिया गया है:

// templated_function.h

template <typename T>
T* null_T_pointer() {
  T* type_point = NULL; // or, alternatively, nullptr instead of NULL
                        // for C++11 or later
  return type_point;
} 


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow