2015-05-17 14 views
10

मेरे पास std::setenv पर एक साधारण कॉल है, जो gcc के तहत मेरे लिनक्स वितरण पर ठीक काम करता है। हालांकि, मेरे मैक ओएस एक्स पर clang का उपयोग करते समय, मुझे निम्न त्रुटि मिलती है।सी ++ मानक लाइब्रेरी - std :: setenv बनाम setenv

error: no member named 'setenv' in namespace 'std'; did you mean simply 'setenv'? 
std::setenv(name.c_str(), value.c_str(), true); 

मुझे यकीन है, मैं पढ़ा है कहीं कि setenv सी ++ 11 में नाम स्थान std का हिस्सा था, लेकिन अब मैं अनिश्चित हूँ।

प्रश्न: setenv या std::setenv का उपयोग किया जाना चाहिए, और यह मामला क्यों है?

उत्तर

12

मैं, नहीं find कुछ भी std::setenvcppr पर पसंद करते हैं केवल std::getenv जो अपने दस्तावेज में संदर्भ देता POSIX समारोह setenv है, जो निश्चित रूप से namespace std में नहीं है।

इसलिए चूंकि आप सी ++ मानक फ़ंक्शन को कॉल नहीं कर रहे हैं, इसलिए सादा setenv जाने का तरीका होना चाहिए क्योंकि इस प्रकार परिभाषित करने वाले मानक को परिभाषित किया गया है। ध्यान दें कि std::setenv को काम करने की अनुमति है (लेकिन आवश्यक नहीं)। (यह भी hvd's comment देखें।)

मानक-प्रेमियों के लिए: setenv केवल समारोह getenv एक डेटा दौड़ (17.6.5.9) प्रदान की परिचय नहीं होगा करने के लिए

कॉल के रूप में उल्लेख किया गया है कुछ भी नहीं पर्यावरण को संशोधित करता है कि । [नोट: POSIX फ़ंक्शन setenv और putenv पर्यावरण को संशोधित करने के लिए कॉल करता है। - अंत नोट]

N3797 18.10.5 से। यह वास्तव में एक सी ++ मानक फ़ंक्शन नहीं है, इस प्रकार namespace std में आवश्यक नहीं है।

+1

सी ++ मानक 'setenv' को परिभाषित नहीं करता है, इसलिए यदि कार्यान्वयन इसे किसी भी एक्सटेंशन के रूप में परिभाषित करता है, तो वे वैश्विक नामस्थान, 'std' नेमस्पेस या किसी अन्य नामस्थान का उपयोग कर सकते हैं, हालांकि वे फिट दिखाई देते हैं। ओपी का कार्यान्वयन जो इसे 'std' नेमस्पेस में घोषित करता है, वह ओपी के अन्य कार्यान्वयन के समान मान्य है जो नहीं करता है। (स्पष्टीकरण के लिए: मैं सहमत हूं कि ओपी का उपयोग करने के लिए सादा 'setenv' है, लेकिन आपका उत्तर इस तरह आता है कि' std :: setenv' काम एक बग है।) – hvd

+0

@hvd लेकिन आगे के दस्तावेज़ों की कमी (I POSIX एक के अलावा किसी भी 'setenv' को नहीं जानते और न ही), मुझे लगता है कि वह पॉज़िक्स के बारे में बात कर रहा है और सोच रहा है कि यह मानक सी ++ फ़ंक्शन भी है। चूंकि POSIX फ़ंक्शन 'नेमस्पेस std' में नहीं है, इसलिए वैश्विक कॉल इसे एक्सेस करने का सामान्य तरीका होगा। जबकि लिनक्स पर स्पष्ट रूप से जीसीसी जैसे कुछ प्लेटफ़ॉर्म इसे 'नेमस्पेस std' में जोड़ते हैं, मानक जो इसे परिभाषित करता है। क्या मै गलत हु? –

+0

@ एचवीडी नोट भी मैंने कभी नहीं कहा कि 'std :: setenv' को काम करने की अनुमति नहीं है, बस गारंटी नहीं है। –

संबंधित मुद्दे