क्या मुझे<xxxx.h> या<cxxxx> C++ प्रोग्राम में शामिल करना चाहिए?




include c++-faq (2)

निम्नलिखित कार्यक्रमों पर विचार करें:

नमूना 1:

#include<stdio.h>

int main()
{
    printf("Hello World");
    return 0;
}

नमूना 2:

#include<cstdio>

int main()
{
    printf("Hello World");
    return 0;
}

दोनों उम्मीद के रूप में काम करते हैं। तो कौन सा उपयोग अधिक उपयुक्त है? जवाब है: न तो! आश्चर्य चकित? पढ़ते रहिये।

सी ++ मानक पुस्तकालय संगतता कारण के लिए सभी मानक सी शीर्षलेख प्रदान करता है, जबकि सी ++ एक भाषा के रूप में सभी समकक्ष शीर्षलेख भी प्रदान करता है। एक सम्मेलन के रूप में,

  • कोई सी ++ मानक लाइब्रेरी हेडर (सी के अलावा सी संगतता के लिए शामिल हैं) में कोई फ़ाइल एक्सटेंशन है, और
  • सभी सी ++ सी हेडर के बराबर cxxxxx साथ शुरू cxxxxx

सी ++ मानक अनुलग्नक डी (मानक) संगतता सुविधाओं के तहत इसका उल्लेख करता है :

§2 महत्वपूर्ण विशिष्ट बिंदु का उल्लेख करता है। यह नियम ऊपर दिए गए उदाहरणों पर लागू होता है:

  • सीएसडीडीओ सहित एसडीडी नेमस्पेस में और संभवतः ग्लोबल नेमस्पेस में प्रतीक नाम आयात करता है।
  • Stdio.h सहित वैश्विक नामस्थान में संभवतः एसडीडी नेमस्पेस में प्रतीक नाम आयात करते हैं।

आइए हम इस नियम को हमारे नमूना कोड पर लागू करें और पेशेवरों और विपक्ष को मापें:

नमूना 1: यह वैश्विक नामस्थान में stdio.h से सभी प्रतीकों को लाता है। लाभ यह है कि आप किसी भी योग्यता के बिना प्रतीकों का उपयोग कर सकते हैं क्योंकि उन्हें वैश्विक नामस्थान में आयात किया जाता है। डाउनसाइड यह है कि आप वैश्विक नामस्थान को कई प्रतीक नामों के साथ प्रदूषित करते हैं जिन्हें आप कभी भी उपयोग नहीं करेंगे। इससे प्रतीकात्मक नाम टकराव हो सकता है। सी ++ में हमेशा वैश्विक नामस्थान को एक खानभूमि के रूप में मानते हैं और जितना संभव हो उससे बचें।

नमूना 2: यह एक बहुत ही बुरा अभ्यास है क्योंकि इस बात की कोई गारंटी नहीं है कि कार्यान्वयन वैश्विक नामस्थान में प्रतीकों को रखेगा, मानक बस ऐसा करने की मांग नहीं करता है। हम बस एक विशेष संकलक कार्यान्वयन के व्यवहार पर भरोसा कर रहे हैं। हम यह नहीं मान सकते कि सभी कंपाइलर ऐसा करेंगे। इसलिए कार्यक्रम को कड़ाई से बोलना मानक अनुमोदित नहीं है और यह उपयोग सभी कार्यान्वयन में पोर्टेबल नहीं है।

तो सही उपयोग क्या है?

सही उपयोग cstdio का उपयोग cstdio और प्रतीक नामों को पूरी तरह अर्हता प्राप्त करना है या अन्यथा घोषणाओं using उन्हें दायरे में लाएं। यह गारंटी देता है कि हम जिन सभी प्रतीकों का उपयोग करते हैं वे std नेमस्पेस में मौजूद हैं और हम वैश्विक नामस्थान प्रदूषित नहीं कर रहे हैं। सही उपयोग का उदाहरण:

नमूना 3:

#include<cstdio>

using std::printf;

int main()
{
    printf("Hello World");
    return 0;
}

ध्यान दें कि using namespace std; निर्देश using namespace std; , विशेष रूप से एक शीर्षलेख में, एक अच्छा विकल्प नहीं है और आपको हमेशा घोषणाओं using उपयोग using उपयोग करना चाहिए।

ध्यान दें कि हम stdio.h बनाम cstdio सिर्फ एक नमूना उपयोग केस पर विचार करते हैं, व्यावहारिक रूप से यह <math.h> और <cmath> जैसे कुछ को छोड़कर , सभी सबसे cxxxx और xxxx.h शीर्षकों पर लागू होता है।

  • सी ++ प्रोग्राम, stdio.h या cstdio में मुझे क्या शामिल करना चाहिए? और क्यों?
  • दो शीर्षलेख फ़ाइलें क्यों समान कार्यक्षमता प्रदान करती हैं?
  • इसके बारे में मानक क्या कहता है?
  • मुझे ऐसे अन्य शीर्षकों सहित कैसे जाना चाहिए, क्या कोई आधार नियम है जिसका मुझे पालन करना चाहिए?

चूंकि यह पोस्ट थोड़ा पुराना है, इसलिए मैं निम्नलिखित साझा करना चाहता था:

कोड देख रहे हैं:

Using X.h   // Compatible with C language standard
---------------
#include <X.h>

int main() {
    // Invoke X's corresponding function
    return 0;
}

Using X    // Not compatible with C language standard
--------------
#include <X>

int main() {
    // Invoke X's corresponding function
    return 0;
}

वे दोनों संकलित और निष्पादन ठीक है!

सी ++ में कौन सा बेहतर है?

C++11 और C++17 के विनिर्देश के संबंध में:

सी.5.1 (सी ++ 17 दस्तावेज़ से अनुभाग)
शीर्षकों में संशोधन [diff.mods.to.headers]

  1. सी मानक पुस्तकालय के साथ संगतता के लिए, सी ++ मानक पुस्तकालय डी 5 में उल्लिखित सी शीर्षलेख प्रदान करता है, लेकिन उनका उपयोग सी ++ में बहिष्कृत है।

  2. सी हेडर <stdatomic.h> , <stdnoreturn.h> , और <threads.h> लिए कोई सी ++ शीर्षलेख नहीं हैं, न ही सी हेडर स्वयं C ++ का हिस्सा हैं।

  3. सी ++ हेडर <ccomplex> (D.4.1) और <ctgmath> (D.4.4), साथ ही साथ उनके संबंधित सी शीर्षलेख <complex.h> और <tgmath.h> , सी से कोई भी सामग्री शामिल नहीं है मानक पुस्तकालय और इसके बजाय केवल सी ++ मानक पुस्तकालय से अन्य शीर्षलेख शामिल हैं।

डी.5 सी मानक पुस्तकालय शीर्षलेख [depr.c.headers] 1. सी मानक पुस्तकालय के साथ संगतता के लिए, सी ++ मानक पुस्तकालय तालिका 141 में दिखाए गए सी शीर्षलेख प्रदान करता है।

सी ++ 11 और सी ++ 17 मानक विनिर्देश दस्तावेज़ दोनों सी मानक के साथ संगतता के लिए <Xh> अवशेषों का उपयोग करते हैं, हालांकि उनके उपयोग को बहिष्कृत माना जाता है।

सी ++ 20 मानक प्रस्ताव के संबंध में

वे सी ++ 20 में सी लाइब्रेरी हेडर के उपयोग को "अपरिवर्तनीय" की समीक्षा कर रहे हैं। <Xh> हरे रंग में हाइलाइट दिखाई दें। सी ++ 11 और सी ++ 17 बहिष्कार, अब तक, "सी कमजोर अनुशंसा" और " सी मानक लाइब्रेरी हेडर (सीहेडर) " को रखने के लिए "ट्वीक" के रूप में वर्णित है:

"मूल सी लाइब्रेरी हेडर एक आवश्यक संगतता सुविधा हैं, और जल्द ही कहीं भी नहीं जा रहे हैं।" ( सी ++ 20 समीक्षा दस्तावेज से )

डी.5 सी मानक
लाइब्रेरी हेडर [depr.c.headers]

कमजोर अनुशंसा: उपरोक्त के अतिरिक्त, सी ++ मानक से संबंधित सी शीर्षलेखों को भी हटा दें, क्योंकि हमारे पास कोई संबंधित <stdatomic.h> , <stdnoreturn.h> , या <threads.h> , हेडर नहीं हैं। ऊपर के रूप में, लेकिन निम्नलिखित tweaks के साथ: 20.5.5.2.1 सी मानक पुस्तकालय शीर्षलेख [सी। हेडर]

सी मानक पुस्तकालय के साथ संगतता के लिए, सी ++ मानक पुस्तकालय तालिका 141 में दिखाए गए सी शीर्षलेख प्रदान करता है। तालिका 141 - सी हेडर

 <assert.h>  <inttypes.h>   <signal.h>      <stdio.h>   <wchar.h>
 <complex.h> <iso646.h>     <stdalign.h>    <stdlib.h>  <wctype.h>
 <ctype.h>   <limits.h>     <stdarg.h>      <string.h>  
 <errno.h>   <locale.h>     <stdbool.h>     <tgmath.h>
 <fenv.h>    <math.h>       <stddef.h>      <time.h>
 <float.h>   <setjmp.h>     <stdint.h>      <uchar.h>

हेडर <complex.h> व्यवहार करता है जैसे कि इसमें हेडर भी शामिल है। हेडर <tgmath.h> व्यवहार करता है जैसे कि इसमें हेडर <complex> और <cmath>

Bjarne Stroustrup जितना संभव हो सके असंगतताओं को कम करके, सी और सी ++ भाषाओं के बीच अंतर-संचालन को अधिकतम करने की सिफारिश करता है। अन्य लोग अन्यथा तर्क देते हैं, क्योंकि यह चीजों को जटिल बनाता है।

तो, ऐसा लगता है <Xh> कहीं नहीं जा रहे हैं। अंत में, आप दोनों का उपयोग कर सकते हैं। निजी तौर पर, मैं निर्णय लेता हूं कि मैं किस कोड का उपयोग सी कोड के साथ संगत संगत होने के लिए उबालता हूं या नहीं।





c++-faq