मानक मतलब है एक चर की परिभाषा की संख्या पर कोई प्रतिबंध नहीं है कि अगर यह नहीं है लगता है ओडीआर रूप से प्रयुक्त (§3.2/3):यदि मैं एक चर का उपयोग नहीं करता हूं, तो क्या मेरे पास अनुवाद इकाइयों में इसकी कई परिभाषाएं हो सकती हैं?
हर कार्यक्रम के ठीक एक परिभाषा शामिल होगा प्रत्येक गैर-इनलाइन फ़ंक्शन या वेरिएबल जो उस प्रोग्राम में ओडीआर-प्रयुक्त होता है; कोई निदान की आवश्यकता नहीं है।
यह कहा गया है कि किसी भी चर एक अनुवाद इकाई (§3.2/1) के अंतर्गत कई बार परिभाषित नहीं किया जा सकता है:
कोई अनुवाद इकाई किसी भी चर के एक से अधिक परिभाषा शामिल होगा, समारोह , वर्ग प्रकार, गणना प्रकार, या टेम्पलेट।
लेकिन मुझे पूरे कार्यक्रम में गैर-ओड-प्रयुक्त चर के लिए प्रतिबंध नहीं मिल रहा है। तो मैं निम्नलिखित की तरह कुछ क्यों संकलन नहीं कर सकते हैं:
// other.cpp
int x;
// main.cpp
int x;
int main() {}
संकलन और जी ++ 4.6.3 के साथ इन फ़ाइलों को जोड़ने, मैं multiple definition of 'x'
के लिए एक लिंकर त्रुटि मिलती है। ईमानदार होने के लिए, मैं इसकी अपेक्षा करता हूं, लेकिन x
कहीं भी ओडीआर-प्रयुक्त नहीं है (जहां तक मैं कह सकता हूं), मैं नहीं देख सकता कि मानक इसे कैसे प्रतिबंधित करता है। या यह अनिर्धारित व्यवहार है?
आप इस निष्कर्ष तक कैसे पहुंचते हैं कि दो नाम 'x' समान चर को इंगित नहीं करते हैं? – ecatmur
@ecatmur: दो चर हैं क्योंकि दो परिभाषाएं हैं: 'int x;' स्थिर भंडारण अवधि के साथ एक चर परिभाषित करता है। ऐसी दो परिभाषाएं हैं, इसलिए दो चर हैं।यदि कार्यक्रम ल्यूक डैंटन द्वारा सुझाए गए अनुसार संशोधित किया गया था, तो केवल एक चर होगा क्योंकि केवल एक परिभाषा होगी ('बाहरी int x;' 'x' का _definition_ नहीं है; यह केवल _declaration_ है)। –
यदि 'int x 'के बजाय, घोषणाओं ने' कक्षा y {};' या 'नेमस्पेस z {}' (दोनों परिभाषाएं) ली, नाम 'y' और' z' क्रमशः उसी प्रकार या नामस्थान को इंगित करेंगे । चर 'x' कैसे भिन्न है? – ecatmur