सी

2010-06-09 1 views
71

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

+0

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

+1

यह भी देखें [सी में 'बाहरी' चर क्या हैं?] (Http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/1433387#1433387) –

+2

संभावित डुप्लिकेट [कैसे करें मैं विभिन्न .c फाइलों के बीच चर साझा करता हूं?] (Http://stackoverflow.com/questions/1045501/how-do-i-share-variables-between-different-c-files) – 7hi4g0

उत्तर

55

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

+0

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

81

एक हेडर फाइल (shared.h) में:

#include "shared.h" 

कई बचने के लिए:

extern int this_is_global; 

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

/* shared.cpp */ 
#include "shared.h" 
int this_is_global; 
+0

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

+6

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

14

आपने घोषणा को हेडर फ़ाइल में डाल दिया है, उदा।

extern int my_global; 

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

int my_global; 

चाहता है कि my_global के लिए उपयोग में extern साथ हेडर फाइल शामिल हर ग फ़ाइल।

21

हेडर फाइल

हेडर फाइल

#ifndef SHAREFILE_INCLUDED 
#define SHAREFILE_INCLUDED 
#ifdef MAIN_FILE 
int global; 
#else 
extern int global; 
#endif 
#endif 
साथ

फ़ाइल में वह फ़ाइल जिसे आप वैश्विक रखना चाहते हैं:

#define MAIN_FILE 
#include "share.h" 

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

#include "share.h" 
+0

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

4

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

#ifdef __cplusplus 
extern "C" { 
#endif 

extern int my_global; 
/* other extern declarations ... */ 

#ifdef __cplusplus 
} 
#endif 
1

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

#define common 
#include "globals.h" 
#undef common 

और इस

#define common extern 
#include "globals.h" 
#undef common 

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

#pragma once 
common int globala; 
common int globalb; 
etc. 

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