2013-02-15 47 views
22

मेरे परियोजना केवल दो स्रोत फ़ाइलों के होते हैं:क्यों "बाहरी कॉन्स int n;" उम्मीद के रूप में काम नहीं करते?

a.cpp:

const int n = 8; 

b.cpp:

extern const int n; 

int main() 
{ 
    // error LNK2001: unresolved external symbol "int const n" ([email protected]@3HB) 
    int m = n; 
} 

मुझे पता है कि यह काम करने के लिए कई तरीके हैं, हालांकि, मुझे आश्चर्य है कि यह क्यों काम नहीं करता है?

+7

'a.cpp' को 'बाहरी कॉन्स int n = 8' में बदलने का प्रयास करें; 'AFAIK' const'' स्थिर 'का तात्पर्य है, हालांकि मुझे वास्तव में पता नहीं है। – Pubby

+0

क्या a.cpp को बाहरी कीवर्ड के साथ n की घोषणा को देखने की आवश्यकता है? –

+0

आपने हमें यह नहीं बताया कि आप क्या लिंक करते हैं और कैसे ... – PlasmaHH

उत्तर

39

ऐसा इसलिए है क्योंकि const डिफ़ॉल्ट रूप से आंतरिक लिंक का तात्पर्य है, इसलिए आपकी "परिभाषा" अनुवाद इकाई के बाहर दिखाई नहीं दे रही है, जहां यह प्रतीत होता है।

इस मामले में, अब तक का सबसे अच्छा समाधान एक हेडर फाइल में घोषणा (extern int const n;) डाल करने के लिए है, और शामिल है कि में दोनों a.cpp और b.cpp। लिंक द्वारा संकलित किया गया पहला संकलन संकलक देखता है, इसलिए a.cpp में बाद की परिभाषा में सही (बाहरी) लिंक होगा। extern बावजूद

extern int const n = 8; 

, यह अभी भी एक परिभाषा है,:

वैकल्पिक रूप से, आप परिभाषा लिंकेज मजबूर कर सकते हैं के साथ कुछ भी एक वर्ग परिभाषा के बाहर एक प्रारंभकर्ता एक परिभाषा है।

2

a.cpp में निर्वासन यह घोषित और बस b.cpp में निर्वासन के बिना उपयोग करें:

आह

extern const int n ; 

a.cpp

#include "a.h" 
... 
const int n= 8 

b.cpp:

#include "a.h" 
... 


int main() 
{   
    int m = n; 
} 
+0

हम्म, हेडर फ़ाइल के साथ ऐसा करने के लिए प्रयोग किया जाता है। बाहरी के साथ हेडर समेत सबसे आसान तरीका है। – Gjordis

+1

असल में, आपको * c const int n; 'b.cpp से हटा देना चाहिए। शामिल हेडर की आवश्यकता है। – Roddy

+0

@ रोडी सही, तदनुसार संशोधित। – Gjordis

5

const और constexpr सी में चर ++ आंतरिक संबंध है, तो वे भी extern घोषित नहीं कर रहे हैं (या तो परिभाषा या किसी पिछली घोषणा में) (और इस प्रकार अन्य संकलन इकाई में सुलभ नहीं हैं)।

सी में, यह मामला नहीं है (अच्छी तरह से सी constexpr नहीं है) इसलिए आपका कोड मान्य है, और आप extern को परिभाषा पर डाल सकते हैं।

तो अगर आप कोड जो दोनों सी और सी है लिखना चाहते ++ (और दो घोषणाओं शायद एक ही हेडर से आनी चाहिए के रूप में जेम्स ने कहा):

// a.cpp 
extern const int n; 
const int n = 8; 

// b.cpp 
extern const int n; 

int main() 
{ 

    int m = n; 
} 

अगर आप

नहीं है
// a.cpp 
extern const int n = 8; 

भी संभव है

+0

@ रोडी, तय। टिप्पणी करने की बजाए इस तरह की चीजों को ठीक करने में संकोच न करें। – AProgrammer

1

To share a const object among multiple files, you must define the variable as extern.

To define a single instance of a const variable, we use the keyword extern on both its definition and declaration(s): 

इन नियमों से आपको अपनी परिभाषा में extern कीवर्ड जोड़ने की आवश्यकता है। आपके पास पहले से ही घोषणा में है।

1

यहाँ अन्य उत्तर चाल ऐसा नहीं करते हैं, यह मामला आप अलग अलग नामस्थान में अपनी परिभाषाएं हैं कि ... अगर संकलन गुजरता है, हो सकता है और आप एक undefined symbol लिंकर त्रुटि मिलती है:

  • अपरिभाषित प्रतीक के नामस्थान की जांच करें; यह extern const int n घोषणा के लिए प्रभावी नामस्थान है।
  • सुनिश्चित करें कि यह आपका प्रभावी नामस्थान है जहां आप const int n = 8 परिभाषा बनाते हैं।