Multi-File Projects
Headers और translation units
Multi-File Projects, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
फ़ाइलों को अलग क्यों करें
वास्तविक प्रोग्राम एक ही .c फ़ाइल में नहीं रहते। कोड को कई फ़ाइलों में बाँटने से:
- संबंधित फ़ंक्शन एक साथ समूहित होते हैं
- कंपाइलर केवल बदले हुए भाग को फिर से बना सकता है
- कोड को अलग-अलग प्रोजेक्ट में दोबारा उपयोग करना संभव होता है
- टीम लगातार टकराव के बिना काम कर सकती है
इन भागों के आपस में जुड़ने का तरीका समझना आवश्यक है।
अनुवाद इकाइयाँ
हर .c फ़ाइल, अपनी #include पंक्तियों का प्रीप्रोसेसर द्वारा विस्तार किए जाने के बाद, एक अनुवाद इकाई बन जाती है।
कंपाइलर हर अनुवाद इकाई को स्वतंत्र रूप से एक ऑब्जेक्ट फ़ाइल (.o) में बदलता है। इस चरण में उसे अन्य फ़ाइलों के बारे में पता नहीं होता।
घोषणा बनाम परिभाषा
घोषणा कंपाइलर को बताती है कि कोई फ़ंक्शन मौजूद है और उसका सिग्नेचर क्या है। परिभाषा वास्तविक बॉडी देती है।
किसी फ़ंक्शन को कॉल करने के लिए अन्य फ़ाइलों को केवल घोषणा चाहिए। परिभाषा ठीक एक स्थान पर रहती है।
int add(int a, int b); /* declaration: a promise */
int add(int a, int b) { /* definition: the body */
return a + b;
}हेडर फ़ाइल
घोषणाएँ हेडर (.h) में रखी जाती हैं। फ़ंक्शन का उपयोग करने वाली कोई भी फ़ाइल हेडर को इनक्लूड करती है।
हेडर सार्वजनिक इंटरफ़ेस है; उससे मेल खाने वाली .c फ़ाइल निजी कार्यान्वयन है।
/* math_utils.h */
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
int mul(int a, int b);
#endifकार्यान्वयन फ़ाइल
.c फ़ाइल अपना हेडर इनक्लूड करती है और फ़ंक्शन परिभाषित करती है।
अपना हेडर इनक्लूड करने से कंपाइलर जाँच सकता है कि परिभाषाएँ घोषणाओं से मेल खाती हैं।
/* math_utils.c */
#include "math_utils.h"
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }मॉड्यूल का उपयोग
दूसरी फ़ाइल हेडर को इनक्लूड करके फ़ंक्शन कॉल करती है। उसे फ़ंक्शन की बॉडी देखने की कभी आवश्यकता नहीं होती।
कंपाइलर घोषणाओं पर भरोसा करता है; लिंकर बाद में कॉल को वास्तविक परिभाषाओं से जोड़ता है।
/* main.c */
#include <stdio.h>
#include "math_utils.h"
int main(void) {
printf("%d\n", add(2, 3));
return 0;
}कंपाइल करना और लिंक करना
दो चरण होते हैं। पहले हर फ़ाइल को -c के साथ ऑब्जेक्ट फ़ाइल में कंपाइल करें। फिर ऑब्जेक्ट फ़ाइलों को एक निष्पादन योग्य में लिंक करें।
लिंकर math_utils.o में परिभाषा खोजकर add के प्रत्येक कॉल का समाधान करता है।
gcc -c main.c # -> main.o
gcc -c math_utils.c # -> math_utils.o
gcc main.o math_utils.o -o appउद्धरण बनाम कोणीय कोष्ठक
इनक्लूड का सिंटैक्स खोज पथ नियंत्रित करता है:
#include "math_utils.h"पहले आपके प्रोजेक्ट निर्देशिका में खोजता है#include <stdio.h>केवल सिस्टम इनक्लूड पथों में खोजता है
अपने हेडर के लिए उद्धरण और मानक लाइब्रेरी के लिए कोणीय कोष्ठक इस्तेमाल करें।
extern कीवर्ड
फ़ाइलों के बीच ग्लोबल चर साझा करने के लिए उसे एक बार .c फ़ाइल में परिभाषित करें और हेडर में extern के साथ घोषित करें।
extern कहता है, 'यह चर कहीं और मौजूद है', जिससे दोहरी परिभाषाओं से बचा जाता है।
/* in config.h */
extern int g_verbose; /* declaration */
/* in config.c */
int g_verbose = 0; /* the single definition */static कीवर्ड
फ़ाइल के दायरे में static किसी फ़ंक्शन या चर को उसकी अनुवाद इकाई तक निजी बना देता है।
किसी अन्य फ़ाइल से static सहायक फ़ंक्शन को लिंक नहीं किया जा सकता, जिससे नामों का टकराव रुकता है और कार्यान्वयन का विवरण छिपा रहता है। C में किसी चीज़ को आंतरिक चिह्नित करने का यही तरीका है।
/* visible only inside this .c file */
static int helper(int x) {
return x * 2;
}एक परिभाषा का नियम
किसी गैर-स्टैटिक फ़ंक्शन या वैश्विक इकाई को पूरे प्रोग्राम में ठीक एक बार परिभाषित किया जा सकता है। इसे कई फ़ाइलों में घोषित करें, लेकिन परिभाषित केवल एक फ़ाइल में करें।
add की दो परिभाषाएँ multiple definition of 'add' जैसी लिंकर त्रुटि उत्पन्न करती हैं। इसी कारण हेडर में फ़ंक्शन का बॉडी नहीं रखा जाता।
त्वरित जाँच
विचार करें कि हेडर में क्या होना चाहिए।
पुनरावलोकन
अब आप कई फ़ाइलों वाली परियोजना को व्यवस्थित कर सकते हैं:
- प्रत्येक
.cएक अनुवाद इकाई है, जिसे स्वतंत्र रूप से.oमें संकलित किया जाता है - हेडर में घोषणाएँ होती हैं; प्रत्येक परिभाषा एक
.cफ़ाइल में होती है - लिंकर ऑब्जेक्ट फ़ाइलों के बीच कॉल का समाधान करता है
externवैश्विक इकाइयों को साझा करता है;staticफ़ाइल-स्थानीय प्रतीकों को निजी रखता है
अगला विषय: Makefile से बिल्ड प्रक्रिया को स्वचालित करना।
एआई शिक्षक के साथ C सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 39
- पाठ
- 144
अक्सर पूछे जाने वाले प्रश्न
क्या “Multi-File Projects” पाठ निःशुल्क है?
हाँ—“Multi-File Projects” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Multi-File Projects” में मैं क्या सीखूँगा?
Headers और translation units आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“Multi-File Projects” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Conditional Compilation
- Multi-File Projects
- Makefiles
- Static और Shared Libraries