2012-01-30 14 views
13

का उपयोग std के बिना g ++ 4.6.1 के साथ फ़ंक्शन, कोई चेतावनी या त्रुटि नहीं दी जाती है।abs के साथ कंपाइलर समस्याओं से बचें()

#include <algorithm> 
#include <cmath> 

double foobar(double a) 
{ 
    return abs(a); 
} 

++ algorithm से शामिल हैं में से एक के माध्यम से ग्लोबल नेम स्पेस में abs() की double संस्करण में खींच किया जा रहा है जी के इस संस्करण में। ऐसा लगता है कि अब इसे मानक द्वारा अनुमति दी गई है (यह question देखें), लेकिन आवश्यक नहीं है।

अगर मैं एक संकलक है कि वैश्विक नाम स्थान (जैसे जी ++ के रूप में 4.2) में abs() की double संस्करण खींच नहीं करता है का उपयोग करके उपरोक्त कोड संकलन है, तो निम्न त्रुटि रिपोर्ट की जाती है:

warning: passing 'double' for argument 1 to 'int abs(int)' 

मैं कैसे कर सकता है ताकि मैं त्रुटियों जब अन्य compilers के साथ प्रयोग किया रोका जा सकता है बल जी ++ 4.6.1, और अन्य compilers कि ग्लोबल नेम स्पेस में कार्यों खींच, एक चेतावनी देने के लिए?

+3

क्या 'का उपयोग कर std :: abs' कि अगर समारोह आप की जरूरत है क्या बुराई है? –

+3

@JonathanLeffler कुछ भी नहीं है, लेकिन यह गलती से बाहर याद आती है करने के लिए आसान हो सकता है। मैं नहीं चाहता कि पर्ची ज्ञात हो और अन्य कंपाइलरों के साथ संकलन के मुद्दों का कारण बन जाए। –

उत्तर

8

समारोह का उपयोग कर रहे वास्तव में abs के पूर्णांक संस्करण है, और जीसीसी पूर्णांक एक अंतर्निहित रूपांतरण करता है।

यह एक साधारण परीक्षण कार्यक्रम द्वारा सत्यापित किया जा सकता है:

#include <iostream> 
#include <cmath> 

int main() 
{ 
    double a = -5.4321; 
    double b = std::abs(a); 
    double c = abs(a); 

    std::cout << "a = " << a << ", b = " << b << ", c = " << c << '\n'; 
} 

आउटपुट है:

 
a = -5.4321, b = 5.4321, c = 5 

इस बारे में एक चेतावनी प्राप्त करने के लिए, -Wconversion ध्वज को जी ++ का उपयोग करें। वास्तव में, उस विकल्प के लिए जीसीसी प्रलेखन स्पष्ट abs बुला जब तर्क एक double है का उल्लेख है। सभी चेतावनी विकल्प here पाया जा सकता है।

+0

नमूना कोड आउटपुट से मेल नहीं खाता है। –

+0

@SamDeHaan क्षमा करें, अपडेट किया गया परिणाम लेकिन कोड को अपडेट करना भूल गया। :) –

+0

यह मानक बदल गया है कि या कि 4.6.1 और नहीं 4.2 के साथ अंतर्निहित रूपांतरण का कारण बनता है जी में ++ के कार्यान्वयन एक बदलाव है? क्या दोनों वैध हैं? –

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

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