2009-12-10 10 views
6

क्या कोई अच्छा कारण है कि यह प्रोग्राम -ansi और -pedantic झंडे के साथ भी जीसीसी के तहत संकलित करता है?जीसीसी एसी और पैडेंटिक झंडे के साथ भी सी ++ में गोल() के उपयोग की अनुमति क्यों देता है?

#include <cmath> 

int main (int argc, char *argv []) 
{ 
    double x = 0.5; 

    return static_cast<int>(round(x)); 
} 

यह g++ -ansi -pedantic -Wall test.cpp -o test के साथ स्वच्छ (कोई चेतावनी, यहां तक ​​कि) संकलित करता है।

मैं दो समस्याओं को देखने:

  1. round() नहीं आईएसओ अनुरूप मोड में सी ++ के लिए उपलब्ध होना चाहिए (क्योंकि यह C99 से आता है)
  2. यहां तक ​​कि अगर round() इस मामले में उपलब्ध थे, यह केवल चाहिए std नामस्थान से

क्या मैं गलत हूं?

उत्तर

2

This is a bug। यह आश्चर्यजनक रूप से लंबे समय तक रहा है। जाहिर है, इसे ठीक करने के लिए सामूहिक इच्छा पर्याप्त नहीं है। सी ++ के एक नए संस्करण के साथ बस कोने के आसपास जो math.h से C99 फ़ंक्शंस को गोद लेगा, ऐसा लगता है कि यह कभी भी तय नहीं होगा।

0

मैं यहाँ आधार बंद हो सकता है, लेकिन जीसीसी के -ansi ध्वज के रूप में अच्छी तरह से सख्त एएनएसआई अनुरूप मोड में सभी पुस्तकालयों स्विचन के बजाय कोड निर्माणों पर लागू नहीं होता (यानी, जीसीसी भाषा एक्सटेंशन को अक्षम)?

+0

जीसीसी के लिए मैन पेज कहता है कि कुछ फ़ंक्शन को परिभाषित नहीं किया जाएगा जब ansi ध्वज सेट किया गया है, लेकिन यह नहीं कि केवल ansi फ़ंक्शंस को परिभाषित किया जाएगा – josefx

+0

@josefx: डी। शॉली को मेरी टिप्पणियां देखें। अधिक जांच करने के बाद, मैंने सीखा है कि पुस्तकालय एक्सटेंशन "अच्छी तरह से गठित कार्यक्रमों के व्यवहार को बदल नहीं सकते"। तो मुझे ऐसा लगता है कि लाइब्रेरी में 'राउंड()' एक्सटेंशन जोड़ना अवैध होगा, जो '-ansi' ध्वज moot का व्यवहार करता है। –

-1

मेरा मानना ​​है कि मानक निर्दिष्ट करते हैं कि कौन से प्रतीकों को परिभाषित करने की आवश्यकता है और किस शीर्षक में उन्हें परिभाषित किया गया है। मुझे विश्वास नहीं है कि मानक बताते हैं कि कोई अन्य प्रतीक परिभाषित नहीं किया जा सकता है। बिंदु पर अधिक, std::round() को round() नामक एक मुक्त प्रतीक द्वारा परिभाषित नहीं किया जा सकता है।

+0

ठीक है, यह सच हो सकता है लेकिन जीसीसी मैनुअल के मुताबिक, '-ansi' का उद्देश्य * सभी गैर-मानक एक्सटेंशन अक्षम * अक्षम करना है। ऐसे किसी भी अतिरिक्त लाइब्रेरी फ़ंक्शन मानक के एक्सटेंशन होंगे (चाहे मानक द्वारा इस तरह के एक्सटेंशन की अनुमति है इस प्रश्न के लिए स्पर्शिक है)। –

+0

मुझे अपनी पिछली टिप्पणी में संशोधन करना चाहिए: '-ansi' * विवादित * एक्सटेंशन अक्षम करता है, जबकि '-pedantic' को सभी एक्सटेंशन अक्षम करना होता है। –

+2

असल में, मैंने सी और सी ++ मानकों को देखा है और हालांकि वे अतिरिक्त लाइब्रेरी फ़ंक्शंस को अनुमति देते हैं, ऐसे एक्सटेंशन "किसी भी अच्छी तरह से गठित प्रोग्राम के व्यवहार को बदल नहीं सकते"। इसका तात्पर्य यह है कि वे किसी भी अतिरिक्त पहचानकर्ता को आरक्षित नहीं कर सकते हैं (यानी एक अच्छी तरह से गठित कार्यक्रम जो परिभाषित करता है कि अपने स्वयं के दौर() फ़ंक्शन को अपने स्वयं के राउंड फ़ंक्शन के साथ मानक को विस्तारित करने वाली लाइब्रेरी द्वारा तोड़ दिया जाएगा)। किसी भी अतिरिक्त लाइब्रेरी फ़ंक्शंस में ऐसे नाम होना चाहिए जो पहले से ही आरक्षित हैं, जैसे '_Round()'। –

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

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