2012-05-04 13 views
7

इस छोटे से कार्यक्रम को देखें।सी ++ 11 में <cstdlib> कभी-कभी सी ++ 03 नहीं होगा?

#include <iostream> 

int main(){ 

    int var = atoi("-99");  //convert string to int 
    var = abs(var);    //takes absolute value 
    std::cout << var+1 <<'\n'; //outputs 100 

    return EXIT_SUCCESS; 
} 

संकलन निम्न त्रुटियों संदेशों बनाता है:

$ g++ -o main main.cpp 
main.cpp: In function ‘int main()’: 
main.cpp:5:13: error: ‘atoi’ was not declared in this scope 
main.cpp:6:16: error: ‘abs’ was not declared in this scope 
main.cpp:9:10: error: ‘EXIT_SUCCESS’ was not declared in this scope 

समझ में आता है। ये सभी "cstdlib" शीर्षलेख में मौजूद हैं जिन्हें मैंने शामिल करने के लिए उपेक्षित किया था।
हालांकि, के साथ संकलन:

$ g++ -std=c++0x -o main main.cpp 

कोई मुद्दा नहीं पैदा करता है।


"cstdlib" शीर्षक के स्रोत को देखते हुए, मैं देख रहा हूँ तल पर निम्नलिखित कोड:

#ifdef __GXX_EXPERIMENTAL_CXX0X__ 
# if defined(_GLIBCXX_INCLUDE_AS_TR1) 
# error C++0x header cannot be included from TR1 header 
# endif 
# if defined(_GLIBCXX_INCLUDE_AS_CXX0X) 
# include <tr1_impl/cstdlib> 
# else 
# define _GLIBCXX_INCLUDE_AS_CXX0X 
# define _GLIBCXX_BEGIN_NAMESPACE_TR1 
# define _GLIBCXX_END_NAMESPACE_TR1 
# define _GLIBCXX_TR1 
# include <tr1_impl/cstdlib> 
# undef _GLIBCXX_TR1 
# undef _GLIBCXX_END_NAMESPACE_TR1 
# undef _GLIBCXX_BEGIN_NAMESPACE_TR1 
# undef _GLIBCXX_INCLUDE_AS_CXX0X 
# endif 
#endif 

मुझे नहीं लगता है कि अगर प्रासंगिक है या नहीं .. पूर्ण हेडर फ़ाइल है कर रहा हूँ कोड here

मेरा अंतिम सवाल यह है कि, क्या नया मानक गारंटी है कि जब आप iostream शामिल करते हैं तो सभी cstdlib को वैश्विक नामस्थान में लाया जाएगा?

मुझे इस मामले पर कोई दस्तावेज नहीं मिल रहा है। मुझे उस तरह से दिखता है, क्या यह आपके लिए ऐसा प्रतीत होता है?

gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 
+3

Btw, इस शीर्षक पूरी तरह से भ्रामक था। सी ++ 11 ** ** सी ++ है। यह एक नई अलग भाषा नहीं है। –

उत्तर

15

मेरी अंतिम सवाल है, नए मानक गारंटी नहीं है कि cstdlib के सभी एक वैश्विक नाम स्थान पर लाया जाएगा जब आप iostream शामिल हैं?

नहीं। यदि आपको इसकी कार्यक्षमता की आवश्यकता है तो आपको #include चाहिए। यदि आपको <iostream> के साथ "मुफ्त में" मिलता है, तो यह एक संकेत है कि आपके <iostream> शीर्षलेख की आवश्यकता है, लेकिन फिर आप अपनी सी ++ लाइब्रेरी के कार्यान्वयन विवरण पर निर्भर हैं।

बीटीडब्ल्यू, #include <cstdlib> सी कार्यों को वैश्विक नामस्थान में लाने की गारंटी नहीं है (हालांकि यह आमतौर पर सी ++ कार्यान्वयन में ऐसा करता है); में विनिर्दिष्ट,

के रूप में 30 के माध्यम से क्लाज 18 में बताया गया है और अनुलग्नक डी, प्रत्येक हेडर cname की सामग्री को इसी हैडर name.h की तरह ही होगा छोड़कर: यह उनके नाम स्थान std में डालने के लिए गारंटी है सी मानक पुस्तकालय (1.2) या सी यूनिकोड टीआर, उपयुक्त के रूप में, जैसे कि शामिल करके। सी ++ मानक पुस्तकालय में, हालांकि, घोषणाएं (नामों को छोड़कर जिन्हें सी में मैक्रोज़ के रूप में परिभाषित किया गया है) नामस्थान std के नामस्थान स्कोप (3.3.6) के भीतर हैं। यह निर्दिष्ट नहीं है कि इन नामों को पहली बार वैश्विक नामस्थान क्षेत्र में घोषित किया गया है और फिर उन्हें स्पष्ट नाम using-घोषणाओं (7.3.3) द्वारा इंजेक्शन दिया गया है।

(स्टैंडर्ड, खंड 17.6.1.2)

+0

अजीब बात है, मुझे atoi –

+1

@Xploit का दायरा नहीं था: मेरी पिछली टिप्पणी कभी भी ध्यान न दें।'' नामस्थान 'std' में 'atoi' डालता है; यदि आपका इसे वैश्विक नामस्थान में भी रखता है, तो यह एक मंच-विशिष्ट एक्सटेंशन है। –

+0

@larsmars यह एक सुविधा नहीं है, यह एक बग है। यह वैश्विक नामस्थान का एक अनजान प्रदूषण है - जो पुस्तकालय लेखक के रूप में बचने के लिए कुख्यात रूप से कठिन है। जीसीसी धीरे-धीरे उन प्रदूषणों को दूर करने का अच्छा काम करता है। बीटीडब्लू, जीसीसी के नए संस्करण के साथ सॉफ़्टवेयर पैकेट्स के गलत संकलन का एक प्रमुख स्रोत है, जो तब तक ठीक संकलित नहीं होता है। – hirschhornsalz