2013-05-13 13 views
7

के एक सदस्य मैं लिनक्स में मेरा कार्यक्रम संकलन नहीं है - यह निम्न पंक्ति है:'sqrt' 'एसटीडी'

std::sqrt((double)num); 

खिड़कियों पर यह ठीक है, लेकिन लिनक्स पर मैं 'sqrt' नहीं है 'std' के सदस्य में मेरे पास math.h

के साथ कोई समस्या है?

+3

क्या आपने '' शामिल किया था? – juanchopanza

+1

'#' शामिल करें, http://en.cppreference.com/w/cpp/numeric/math/sqrt – hmjd

उत्तर

14

निर्देश को #include <cmath> पर बदलें। फॉर्म <cxxxxxxx> के सी ++ शीर्षलेख std नामस्थान में मानक नाम होने की गारंटी है (और वैकल्पिक रूप से उन्हें वैश्विक नामस्थान में प्रदान कर सकते हैं)। <xxxxxx.h> नहीं हैं।

+0

'C++ 11' से पहले std namespace में मानक नाम होने की गारंटी है। बेशक कारण 11 के लिए आराम किया गया था कि कुछ कार्यान्वयन कभी परेशान नहीं था। – BoBTFish

+4

@BoBTFish अभी भी 'std' नेमस्पेस में मानक नाम होने की गारंटी है। प्री सी ++ 11, इसे वैश्विक नामस्थान में रखने के लिए _not_ की गारंटी भी थी। सी ++ 11 उन्हें वैश्विक नामस्थान में भी रहने की अनुमति देता है, क्योंकि यह सबसे व्यापक मौजूदा अभ्यास था। –

+1

@BoBTFish जेम्सकांज ने क्या कहा, 17.6.1.2/4 देखें। – jrok

2

यह केवल इसलिए है क्योंकि <math.h>namespace std में फ़ंक्शंस घोषित नहीं करता है। इसे केवल संगतता कारणों के लिए सी ++ मानक में शामिल किया गया है। सही सी ++ में <cmath> होगा।

§D.5,2

हर सी हैडर, जिनमें से प्रत्येक प्रपत्र name.h का एक नाम है, बर्ताव करता है के रूप में प्रत्येक नाम इसी cname हैडर द्वारा मानक पुस्तकालय नाम स्थान में रखा है अगर वैश्विक नामस्थान क्षेत्र के भीतर रखा गया है। यह निर्दिष्ट नहीं है कि इन नामों को नामस्थान std के नेमस्पेस दायरे में पहली बार घोषित या परिभाषित किया गया है और फिर स्पष्ट का उपयोग करके वैश्विक नामस्थान स्कोप में इंजेक्शन दिया गया है-घोषणाएं

कि आपका कोड विंडोज़ के तहत काम करता है वह शुद्ध भाग्य था - अगर आप इसे कॉल करना चाहते हैं। अंतिम वाक्य विंडोज के तहत क्या हो सकता है, लेकिन लिनक्स के तहत नहीं हो सकता है: विंडोज़ के तहत, स्पष्ट रूप से नाम वैश्विक नामस्थान और नामस्थान std दोनों में मान्य हैं।

+0

'' मानक संगतता का हिस्सा है, "संगत सुविधा" के रूप में। वास्तव में, कम से कम कुछ मामलों में इसे पसंद करने के अच्छे कारण हैं। बेशक, यह ':: वर्ग 'घोषित करता है, और' std :: sqrt' नहीं। –

+0

@JamesKanze सुधार के लिए धन्यवाद, मुझे इसके बारे में पता नहीं था। मैंने अपना जवाब बदल दिया। –

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