सी में साझा वैश्विक चर


82

मैं वैश्विक चर कैसे बना सकता हूं जो सी में साझा किए गए हैं? यदि मैंने इसे हेडर फ़ाइल में रखा है, तो लिंक करने वाले को शिकायत है कि चर पहले से ही परिभाषित हैं। क्या मेरी सी फ़ाइलों में से एक को चर घोषित करने का एकमात्र तरीका है और externअन्य सभी सी फाइलों के शीर्ष पर इसे मैन्युअल रूप से डालना है जो इसका उपयोग करना चाहते हैं? यह आदर्श नहीं है।


अपने स्वयं के स्रोत कोड में साझा किया गया? एक हेडर फाइल में एक्सटर्नल डिक्लेरेशन लगाएं, और दूसरे (सिंगल) सोर्स में परिभाषा दें। जिन्हें आपके प्रोसेस थ्रेड्स के बीच शेयर किया गया है। डेटा के इंटरप्रोसेस शेयरिंग के लिए, IPC मैकेनिज्म (शेयर्ड मेमोरी, पाइप) का उपयोग करें।
हर्नान



जवाबों:


64

शीर्ष लेख फ़ाइल में इसे लिखें extern। और सी फ़ाइलों में से एक के वैश्विक दायरे में इसे बिना घोषित किए extern


1
क्या हम इसे * .c फ़ाइल की हेडर फ़ाइल के बजाय घोषित कर सकते हैं?
जेरेमिया

91

एक हेडर फ़ाइल (साझा.एच) में:

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

कई लिंकर परिभाषाओं से बचने के लिए, आपके वैश्विक प्रतीक की सिर्फ एक घोषणा आपकी संकलन इकाइयों में मौजूद होनी चाहिए (उदाहरण: साझा.सी.पी.):


क्या आपके पास IPC तंत्र के बारे में अधिक जानने के लिए कोई पसंदीदा संदर्भ है?
निको 23

7
कृपया "अपने वैश्विक प्रतीक की सिर्फ एक घोषणा ..." पर अधिक जोर दें। मेरे पास उन सभी सी फाइलों पर घोषणा थी, जिन पर मैं वैश्विक चर का उपयोग करना चाहता था :(
एंटोनियो सीएसएस

22

हेडर फ़ाइल में

शीर्ष लेख फ़ाइल

फ़ाइल में उस फ़ाइल के साथ जिसे आप जीना चाहते हैं:

अन्य फ़ाइलों में जो बाहरी संस्करण की आवश्यकता है:


आह यह एक समाधान है जो मैंने कुछ समय पहले किया था - मैं MAIN_FILE प्रीप्रोसेसर चर के बारे में भूल गया। मैं थिनिक को पसंद करता हूं जैसे कि मुझे स्वीकार किया गया उत्तर अधिक tho
क्लाउडी

15

आपने घोषणा को हेडर फ़ाइल में रखा है, जैसे

आपकी .c फ़ाइलों में से एक में आप इसे वैश्विक दायरे में परिभाषित करते हैं।

हर .c फाइल जो कि my_globalहेडर फाइल को शामिल करना चाहता externहै।


5

यदि आप C और C ++ के बीच कोड साझा कर रहे हैं, तो shared.hफ़ाइल में निम्न जोड़ना याद रखें :


2

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

और इस तरह से किसी भी अन्य स्रोत फ़ाइलें

बस सुनिश्चित करें कि आप ग्लोबल्स.ह फ़ाइल में किसी भी चर को इनिशियलाइज़ नहीं करते हैं या लिंकर फिर भी शिकायत करेगा क्योंकि इनिशियेटेड वेरिएबल को बाहरी कीवर्ड के साथ भी बाहरी नहीं माना जाता है। Global.h फ़ाइल इससे मिलती-जुलती लगती है

किसी भी प्रकार की घोषणा के लिए काम करने लगता है। #Define पर सामान्य कीवर्ड का उपयोग न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.