इस अगर मैं जगह में गार्ड है क्यों होता है? मैंने सोचा कि उन्होंने पहली पहुंच के बाद हेडर को पढ़ने से रोका था।
गार्ड सुनिश्चित करें कि एक हैडर केवल में एक फ़ाइल (अनुवाद इकाई) एक बार शामिल किया गया है बनाने शामिल करें। शीर्षलेख सहित कई फ़ाइलों के लिए, आप प्रत्येक फ़ाइल में हेडर को शामिल करना चाहते हैं।
को परिभाषित करने, के रूप में अपने हेडर फाइल में बाहरी लिंकेज के साथ चर (वैश्विक चर) की घोषणा करने का विरोध करके, आप केवल एक बार स्रोत फ़ाइल में हेडर को शामिल कर सकते हैं। यदि आप एकाधिक स्रोत फ़ाइलों में शीर्षलेख शामिल करते हैं, तो एक चर की कई परिभाषाएं होंगी, जिन्हें सी ++ में अनुमति नहीं है।
तो, जैसा कि आपने पाया है, ऊपर दिए गए कारण के लिए हेडर फ़ाइल में वेरिएबल्स को परिभाषित करना एक बुरा विचार है।
इस शीर्षलेख में कई enums क्यों LNK4006 चेतावनियां नहीं देते हैं?
क्योंकि, वे "वैश्विक चर" को परिभाषित नहीं करते हैं, वे केवल प्रकारों के बारे में घोषणाएं हैं, आदि। वे किसी भी भंडारण को आरक्षित नहीं करते हैं।
यदि मैं हस्ताक्षर से पहले स्थैतिक जोड़ता हूं, तो मुझे चेतावनी नहीं मिलती है। इस तरह से करने के प्रभाव क्या हैं।
जब आप एक चर static
बनाने के लिए, यह स्थिर गुंजाइश है। ऑब्जेक्ट अनुवाद इकाई (फ़ाइल) के बाहर दिखाई नहीं देता है जिसमें इसे परिभाषित किया गया है। तो, सरल शब्दों में, यदि आपके पास:
static int i;
अपने शीर्षक में, प्रत्येक स्रोत फ़ाइल जिसमें आप शीर्ष लेख एक अलगint
चर i
, जो स्रोत फ़ाइल के अदृश्य बाहर है मिल जाएगा शामिल हैं। इसे आंतरिक लिंक के रूप में जाना जाता है।
क्या ऐसा करने का कोई बेहतर तरीका है जो त्रुटि से बचाता है, लेकिन मुझे हेडर में सरणी घोषित करने देता है। मैं वास्तव में एक सरणी परिभाषा के लिए एक सीपीपी फ़ाइल होने से नफरत करता हूं।
आप सरणी चाहते हैं अपने सभी सी ++ फ़ाइलों से एक वस्तु दिखाई दे सकता है, आपको क्या करना चाहिए:
extern int array[SIZE];
अपने हेडर फाइल में, और तब सभी सी ++ स्रोत फ़ाइलों में हेडर फाइल शामिल उस चर array
की आवश्यकता है। स्रोत (.cpp
) फ़ाइलों में से एक में, आप array
परिभाषित करने की जरूरत:
int array[SIZE];
आप शीर्ष लेख में एक अंतर के कारण गलतियों को पकड़ने के लिए अनुमति देने के लिए, साथ ही ऊपर स्रोत फ़ाइल में हेडर होना चाहिए और स्रोत फ़ाइल।
असल में, extern
संकलक कि कहता है "array
कहीं परिभाषित किया गया है, और प्रकार int
, और आकार SIZE
है।" फिर, आप वास्तव में array
को केवल एक बार परिभाषित करते हैं। लिंक चरण पर, सबकुछ अच्छी तरह से हल हो जाता है।
लिंकर सिर्फ सूचक वाक्यविन्यास में सरणी वाक्यविन्यास का अनुवाद कर रहा है। यह कोई त्रुटि नहीं है, यह सिर्फ एक चेतावनी है, कार्यक्रम अपेक्षित के रूप में निष्पादित करता है। – Steve