कई साल बाद, मुझे इस सवाल का पता चला। हर उत्तर और टिप्पणी को पढ़ने के बाद, मुझे लगा कि मैं कुछ विवरणों को स्पष्ट कर सकता हूं ... यह उन लोगों के लिए उपयोगी हो सकता है जो Google खोज के माध्यम से यहां आते हैं।
प्रश्न विशेष रूप से "बाहरी" कार्यों का उपयोग करने के बारे में है, इसलिए मैं वैश्विक चर के साथ "बाहरी" के उपयोग की उपेक्षा करूंगा।
आइए 3 फ़ंक्शन प्रोटोटाइप को परिभाषित करें:
//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
हेडर फ़ाइल का उपयोग मुख्य स्रोत कोड द्वारा निम्नानुसार किया जा सकता है:
//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"
void main(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
संकलन और लिंक करने के लिए, हमें उसी फ़ंक्शन कोड फ़ाइल में "function_2" को परिभाषित करना चाहिए, जहां हम उस फ़ंक्शन को कॉल करते हैं। दो अन्य कार्यों को विभिन्न स्रोत कोड " .सी" में परिभाषित किया जा सकता है या वे किसी भी बाइनरी फ़ाइल ( .OBJ, * .LIB, * .DLL) में स्थित हो सकते हैं , जिसके लिए हमारे पास स्रोत कोड नहीं हो सकता है।
चलो फिर से बेहतर अंतर को समझने के लिए हेडर "my_project.H" को एक अलग "* .सी" फ़ाइल में शामिल करें। उसी परियोजना में, हम निम्नलिखित फ़ाइल जोड़ते हैं:
//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
नोटिस करने के लिए महत्वपूर्ण विशेषताएं:
जब किसी फ़ंक्शन को हेडर फ़ाइल में "स्थिर" के रूप में परिभाषित किया जाता है, तो कंपाइलर / लिंकर को प्रत्येक मॉड्यूल में उस नाम के साथ फ़ंक्शन का एक उदाहरण खोजना होगा जो फ़ाइल का उपयोग करता है।
एक फ़ंक्शन जो सी लाइब्रेरी का हिस्सा है, केवल एक मॉड्यूल को उस मॉड्यूल में केवल "स्थिर" के साथ एक प्रोटोटाइप को फिर से परिभाषित करके बदला जा सकता है। उदाहरण के लिए, मेमोरी लीक डिटेक्शन फीचर को जोड़ने के लिए किसी भी कॉल को "मॉलोक" और "फ्री" में बदलें।
निर्दिष्ट "बाहरी" कार्यों के लिए वास्तव में आवश्यक नहीं है। जब "स्थिर" नहीं पाया जाता है, तो एक फ़ंक्शन को हमेशा "बाहरी" माना जाता है।
हालांकि, "बाहरी" चर के लिए डिफ़ॉल्ट नहीं है। आम तौर पर, कोई भी हेडर फ़ाइल जो कई मॉड्यूलों में दृश्यमान होने के लिए चर को परिभाषित करती है, को "बाहरी" का उपयोग करने की आवश्यकता होती है। केवल एक अपवाद होगा यदि हेडर फ़ाइल को एक और केवल एक मॉड्यूल से शामिल करने की गारंटी दी जाती है।
कई प्रोजेक्ट मैनेजर को तब आवश्यकता होगी कि इस तरह के वेरिएबल को मॉड्यूल की शुरुआत में रखा जाए, न कि किसी हेडर फाइल के अंदर। कुछ बड़े प्रोजेक्ट्स, जैसे कि वीडियो गेम एमुलेटर "मैम" को भी आवश्यकता होती है कि इस तरह का वैरिएबल उनके उपयोग से पहले फ़ंक्शन के ऊपर दिखाई दे।