2012-05-22 9 views
39

मैंने iostream बनाम iostream.h जैसी चीज़ों के बीच अंतर के बारे में कुछ जानकारी देखी है। उन लोगों से जो मैंने एकत्र किया उनमें से अंतर यह है कि .h एक्सटेंशन के बिना संस्करण नामस्थान को पॉप्युलेट नहीं करेगा, जबकि एक्सटेंशन के साथ संस्करण होगा।सी ++ - सेमीथ बनाम math.h (और इसी तरह के सी-प्रीफिक्स्ड बनाम एचएच एक्सटेंशन हेडर)

क्या यह cmath बनाम math.h के लिए समान है? cmath (और इस तरह की कई अन्य फाइलें) के साथ math होने के बजाय प्रीफ़िक्स क्यों है? क्या उनके बीच और अंतर हैं?

आपके समय के लिए धन्यवाद!

+0

भी देखें http://stackoverflow.com/q/2118422 और http: // stackoverflow।संबंधित (लेकिन शायद डुप्ली नहीं) प्रश्नों के लिए कॉम/क्यू/2587445। –

उत्तर

22

मैं iostream iostream.h बनाम जैसी चीजों में अंतर के बारे में कुछ जानकारी देखा है।

[iostream.h] मानक हेडर नहीं है।

यह आपके द्वारा उठाए जा रहे मुद्दे का एक उदाहरण नहीं है।

[cmath] std नेमस्पेस में प्रतीकों को परिभाषित करता है, और वैश्विक नामस्थान में प्रतीकों को भी परिभाषित कर सकता है। [math.h] वैश्विक नामस्थान में प्रतीकों को परिभाषित करता है, और std नामस्थान में प्रतीकों को भी परिभाषित कर सकता है। यदि आप पूर्व को शामिल करते हैं और एक अयोग्य प्रतीक का उपयोग करते हैं, तो यह एक कंपाइलर के साथ संकलित हो सकता है लेकिन दूसरे के साथ नहीं। इसलिए [math.h] का उपयोग करना एक अच्छा विचार है। और सामान्य रूप से, ऐसे हेडर जोड़े के लिए, [.h] संस्करण का उपयोग करने के लिए।

सी ++ 98 ने वैश्विक नामस्थान को प्रदूषित न करने वाले सी xxx हेडर की औपचारिक गारंटी प्रदान की। शायद यही कारण है कि उन्हें परिभाषित किया गया था। हालांकि, प्रदूषण वाले लोगों की तुलना में इसे लागू करना थोड़ा कठिन था, इसलिए व्यावहारिक रूप से कोई मानक लाइब्रेरी कार्यान्वयन नहीं है जिसे मैं इस संबंध में मानक का पालन करने के बारे में जानता हूं, और इसलिए इसे अंततः सी ++ 11 में वास्तविकता को प्रतिबिंबित करने के लिए बदल दिया गया।

+8

'इसलिए [math.h] का उपयोग करना एक अच्छा विचार है। और सामान्य रूप से, ऐसे हेडर जोड़े के लिए, [.h] संस्करण का उपयोग करने के लिए। 'मैं असहमत हूं। संगतता के लिए .h संस्करण मौजूद हैं एकमात्र कारण है। सी हेडर एक कारण के लिए [** depr **। C.headers] के अंतर्गत सूचीबद्ध हैं। –

+12

@ जेसे: तर्क यह है कि यदि आप 'math.h' शामिल करते हैं, तो आप * जानते हैं * आप अपने वैश्विक नामस्थान में जंक का ढेर छोड़ रहे हैं। यदि आप 'cmath' शामिल करते हैं तो आप * अपने वैश्विक नामस्थान में जंक का ढेर छोड़ सकते हैं या नहीं। इसके विपरीत, आपको परवाह नहीं है कि आप नामस्थान 'std' में जंक का ढेर छोड़ते हैं या नहीं, क्योंकि आप कभी भी वहां पर प्रतीकों को परिभाषित नहीं करते हैं। इसलिए 'गणित' के बारे में अनिश्चितता कुछ अर्थों में 'cmath' के बारे में अनिश्चितता से बेहतर है, इस पर ध्यान दिए बिना कि समिति इसके बारे में क्या सोचती है। –

+0

@ एएलएफ: क्या ईडीजी भी सी ++ 03 में गलत है? शर्म की बात है। –

1

शीर्षलेख जिनके नाम c से शुरू होते हैं, वे सी मानक पुस्तकालय के शीर्षकों से प्राप्त होते हैं। c उपसर्ग के साथ संबंधित शीर्षलेख हटा दिए गए हैं और .h प्रत्यय जोड़े सी मानक लाइब्रेरी शीर्षलेखों के समान (या लगभग समान) हैं।

<cmath>std नाम स्थान के तहत संबंधित प्रतीकों परिभाषित करता है; <math.h> उन्हें विश्व स्तर पर परिभाषित करता है।

(मैं सिर्फ यह काफी इतना आसान नहीं है सीखा;। Alf के जवाब देख)

+3

-1 नहीं, शीर्षलेख जो 'सी' से शुरू होते हैं, सी मानक लाइब्रेरी हेडर के विशिष्ट प्रकार हैं। वे सी पुस्तकालय से नहीं आते हैं। भी, इस बात की कोई गारंटी नहीं है कि 'cmath' वैश्विक नामस्थान में प्रतीकों को परिभाषित नहीं करता है, और इस बात की कोई गारंटी नहीं है कि' math.h' 'std' नेमस्पेस में प्रतीकों को परिभाषित नहीं करता है। –

+1

@ चीयर्संधथ-अल्फ: मेरे हिस्से पर मैला शब्द; मेरा मतलब यह नहीं था कि "सी मानक पुस्तकालय से" यह इंगित करने के लिए कि वे सी मानक पुस्तकालय से सीधे * हैं। मुझे नहीं पता था कि ' 'वैश्विक प्रतीकों को परिभाषित कर सकता है और' '' std' नेमस्पेस में प्रतीकों को परिभाषित कर सकता है। अब मुझे पता है, मैं उलझन में हूँ; सी ++ मानक क्यों कार्यान्वयन-परिभाषित छोड़ देता है? –

+0

@ किथ थॉम्पसन: क्योंकि यह वास्तविकता को दर्शाता है। मानक लाइब्रेरी कार्यान्वयन के बहुत सारे ने इसे इतने लंबे समय तक किया है। इस मुद्दे के बारे में अधिक सख्त होने के लिए कार्यान्वयन को मजबूर करने के बजाय (अनुभव से पता चलता है कि यह काफी काम नहीं कर पाया है), मानक समिति ने प्रोग्रामर की अपेक्षाओं को आराम दिया। –

0

हो सकता है कि यह उपयोगी होगा:

सी ++ पुस्तकालय निम्नलिखित अंतर के साथ, हेडर फाइल का एक ही संरचना में आयोजित सी भाषा पुस्तकालय के रूप में ही परिभाषाओं में शामिल हैं: प्रत्येक हेडर फाइल एक ही है सी भाषा संस्करण के रूप में नाम है लेकिन "सी" उपसर्ग और कोई एक्सटेंशन नहीं है। उदाहरण के लिए, सी ++ सी भाषा शीर्षलेख फ़ाइल के बराबर सी 0+ है। पुस्तकालय के प्रत्येक तत्व को std नामस्थान के भीतर परिभाषित किया गया है।

c-prefixed vs .h extension headers

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