दिलचस्प पोस्ट
जेएस सरणी से डुप्लिकेट मान निकालें अपनी स्वयं की फ़ंक्शन लिखते समय आर की एलीपिसिस सुविधा का उपयोग कैसे करें? सी # के साथ नेटवर्क शेयरों की गणना एचटीसी रेफरर को हटाएं कुछ छवियों के लिए कैश अक्षम करें क्या आईओएस में ब्लूटूथ और / या वाईफाई को प्रोग्रामेटिक रूप से बंद करने का कोई तरीका है? एजेएक्स संचालित साइट पर सही नियंत्रण को चुनना और सक्रिय करना नोडजेएस विंडोज़ पर स्थापित मॉड्यूल नहीं मिल सकता है? मैं Node.js को कैसे अपडेट करूं? अपनी भाषा में एक कंपाइलर लेखन कैस्परजेएस में तब () बयान में क्या लिपटे जाना चाहिए? सिंक / async फ़ंक्शंस के निष्पादन आदेश का निर्धारण कैसे करें? कैसे सच विंडोज संस्करण का पता लगाने के लिए? रेल में, आप एक दृश्य का उपयोग करके JSON को कैसे प्रस्तुत करते हैं? प्रोग्राम scanf ("% c", और ch) लाइन पर क्यों नहीं रोकता है, क्यों? नामकरण कक्षाएं – सब कुछ एक "<WhatEver> प्रबंधक" से बचना कैसे करें?

मैं अलग सी। सी फाइलों के बीच चर कैसे साझा करूं?

सी घोषणा के बारे में शुरुआती सवाल:

एक। सी फ़ाइल में, अन्य। सी फ़ाइल में परिभाषित चर का उपयोग कैसे करें?

वेब के समाधान से एकत्रित समाधान "मैं अलग सी। सी फाइलों के बीच चर कैसे साझा करूं?"

FileA.c में:

int myGlobal = 0; 

FileA.h में

 extern int myGlobal; 

फ़ाइल बी में:

 #include "fileA.h" myGlobal = 1; 

तो यह कैसे काम करता है:

  • फ़ाइल ए सी में चर रहता है
  • fileA.h दुनिया बताता है कि यह मौजूद है, और इसके प्रकार क्या है ( int )
  • fileB.c में fileA.h भी शामिल है, ताकि fileB.c फाइल करने से पहले कंपाइलर myGlobal के बारे में जानता है।
  1. ग्लोबल्स से बचने की कोशिश करें यदि आपको वैश्विक उपयोग करना है, तो अन्य उत्तर देखें।
  2. इसे फ़ंक्शन के तर्क के रूप में पास करें

यदि वेरिएबल है:

 int foo; 

दूसरी सी फ़ाइल में आप घोषणा करते हैं:

 extern int foo; 

99.9% सभी मामलों में गैर-स्थिर, फाइल के बीच वैश्विक चर को साझा करने के लिए यह खराब प्रोग्राम डिज़ाइन है। जब आपको वास्तव में ऐसा करने की आवश्यकता होती है तो बहुत कम मामले हैं: वे इतने दुर्लभ हैं कि मैं किसी भी वैध मामलों के साथ नहीं आ सकता। हार्डवेयर रजिस्ट्रार की घोषणा शायद

ज्यादातर मामलों में, आप या तो इसके बजाय (संभवतः इनलाइन) सेटर / गेटर्स फ़ंक्शंस ("सार्वजनिक"), फ़ाइल स्कोप पर स्थिर वैरिएबल ("निजी"), या अपूर्ण प्रकार लागूकरण ("निजी") का उपयोग करना चाहिए।

उन कुछ दुर्लभ मामलों में जब आपको फ़ाइलों के बीच एक चर को साझा करने की आवश्यकता होती है, तो ऐसा करें:

 // file.h extern int my_var; // file.c #include "file.h" int my_var = something; // main.c #include "file.h" use(my_var); 

एच-फाइल में किसी भी प्रकार की चर परिभाषा न डालें

उन अन्य वेरिएबल्स को सार्वजनिक घोषित करना होगा (उपयोग करें, सार्वजनिक सी ++ के लिए), और आपको उस। सी फ़ाइल को शामिल करना होगा। हालांकि, मैं आपके सभी चर को परिभाषित करने के लिए उचित .h फाइल बनाने की सलाह देता हूं।

उदाहरण के लिए, hello.c के लिए, आपके पास एक हैलो हो जाएगा। एच, और हैलो। एच आपकी चर परिभाषाओं को स्टोर करेगा। फिर एक और। सी फ़ाइल, जैसे world.c में शीर्ष पर कोड का यह टुकड़ा होगा:

 #include "hello.h" 

इससे world.c को hello.h में परिभाषित चर का उपयोग करने की अनुमति होगी

यह थोड़ा और अधिक जटिल है हालांकि, हालांकि। आप <> अपने ओएस पथ पर मिली लाइब्रेरी फ़ाइलों को शामिल करने के लिए उपयोग कर सकते हैं। शुरुआत के रूप में मैं एक ही फ़ोल्डर में आपकी सभी फाइलों को छड़ी करूँगा और "" वाक्यविन्यास का उपयोग करेगा

दूसरी फ़ाइल को आपके चर के अस्तित्व के बारे में जानने की जरूरत है ऐसा करने के लिए आप फिर से चर की घोषणा करते हैं, लेकिन इसके सामने कीवर्ड extern उपयोग करें। यह कंपाइलर को बताता है कि वेरिएबल उपलब्ध है, लेकिन कहीं और घोषित कर दिया है, इस प्रकार इसे instanciating रोकने (फिर से, जो लिंक करते समय संघर्ष होता है)। जब आप सी फाइल में extern घोषणा डाल सकते हैं , तो यह प्रत्येक सामान्य .c लिए एक साथ हैडर (यानी .h ) फाइल करने के लिए आम शैली है, जो कि दूसरों के लिए फ़ंक्शन या वेरिएबल्स प्रदान करता है जो extern घोषणाओं को रखते हैं। इस तरह आप extern घोषणा की प्रतिलिपि से बचें, खासकर अगर यह एकाधिक अन्य फाइलों में उपयोग किया जाता है वही कार्यों के लिए भी लागू होता है, हालांकि आपको उनके लिए कीवर्ड extern जरूरत नहीं है।

इस प्रकार आपके पास कम से कम तीन फाइलें होंगी: स्रोत फ़ाइल जो चर को घोषित करती है, यह एक हेल्पमेंट हैडर है जो extern घोषणा करता है और दूसरा स्रोत फ़ाइल है जिसमें निर्यात किए गए चर (या किसी भी अन्य प्रतीक का निर्यात करने के लिए शीर्षलेख #include शीर्ष लेख में) बेशक आपको सभी स्रोत फाइलों (या उपयुक्त ऑब्जेक्ट फाइलों) की ज़रूरत है, जब ऐसा कुछ करने की कोशिश करनी चाहिए, क्योंकि लिंकर को उस प्रतीक को हल करने की जरूरत है, जो केवल तभी संभव है यदि यह वास्तव में लिंक किए गए फाइलों में मौजूद है