2016-06-02 10 views
5

में पॉइंटर सरणी की स्थिरता के कारण त्रुटि को जोड़ना यह समस्या -std=c++14 से पहले g ++ में पुन: उत्पन्न होती है। नीचे दिए गए कोड में दिखाए गए const पर प्रकाश डालने के कारण एक लिंकिंग त्रुटि उत्पन्न होती है। यह गायब हो जाता है, अगर आरएचएस const हटा दिया गया है।सी ++ 03/सी ++ 11

/* main.cpp */ 
const char* const arr[2] = {"Hello", "World"}; 
//   ^^^^^ 
int main() {} 

और

/* foo.cpp */ 
extern const char* const arr[2]; 
//     ^^^^^ 
const char* foo() { return arr[0]; } 

जबकि संकलन: g++ [-std=c++11] main.cpp foo.cpp, यह निम्न देता जोड़ने त्रुटि:

In function `foo()': undefined reference to `arr' 

यह एक संकलक बग या एक भाषा सीमा/सुविधा है?

+3

'नाम स्थान दायरे में const' चर [परोक्ष हैं' static'] (http://stackoverflow.com/questions/33402177/const-global-variable-in-namespace), जब तक आप 'extern' जोड़ें। मुझे यकीन नहीं है कि व्यवहार '-std = C++ 14' के साथ क्यों बदलता है। – Quentin

+0

'बाहरी कॉन्स char * const arr [2] नहीं होना चाहिए;' हेडर फ़ाइल में होना चाहिए जो 'main.cpp' और' foo.cpp' दोनों में शामिल है? – NathanOliver

+0

@ क्वांटिन मुझे यकीन नहीं है कि क्यों ओपी पूर्व सी ++ 14 कहता है, जी ++ 5.1.0 किसी भी मोड में त्रुटि उत्पन्न करता है (सी ++ 14 सी ++ 17), आपकी टिप्पणी जवाब होना चाहिए – Slava

उत्तर

3

क्वेंटिन द्वारा देखा के रूप में, मसौदा n4296 अध्याय 3.5 कार्यक्रम में इस बारे में स्पष्ट है और लिंकेज [basic.link] §3 (मेरा जोर देना)

A name having namespace scope (3.3.6) has internal linkage if it is the name of
(3.1) — a variable, function or function template that is explicitly declared static; or,
(3.2) — a variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage;

जब आप arr घोषित स्थिरांक हो सकता है, यह है निहित आंतरिक जुड़ाव दिया। ठीक तुच्छ है:

/* main.cpp */ 
extern const char* const arr[2] = {"Hello", "World"}; 

लेकिन सबसे अच्छा अभ्यास सही ढंग से घोषणा साझा करने के लिए और फिर उन फ़ाइलों const char* const arr[2] = {"Hello", "World"}; में से एक में जोड़ने के लिए, प्रभावी रूप से उपज क्रम में arr का उपयोग कर एक हैडर सभी फ़ाइलों में शामिल में extern const char* const arr[2]; के लिए सिफारिश करेंगे:

/* main.cpp */ 
extern const char* const arr[2]; // directly or more likely through an include... 
... 
const char* const arr[2] = {"Hello", "World"};