मुझे क्यों नहीं # निकलना चाहिए <बिट्स / stdc ++। H>?


267

मैंने अपने कोड के साथ एक प्रश्न पोस्ट किया जिसका केवल #includeनिर्देश निम्नलिखित था:

#include <bits/stdc++.h>

मेरे शिक्षक ने मुझे ऐसा करने के लिए कहा, लेकिन टिप्पणी अनुभाग में मुझे बताया गया कि मुझे नहीं करना चाहिए।

क्यों?


72
हुह। मुझे पता होना चाहिए कि using namespace std;वहाँ कहीं बाहर का एक संस्करण शामिल होगा।
user4581301

1
यह हैडर भी क्यों मौजूद है? निश्चित रूप से किसी भी मानक में वास्तव में यह शामिल नहीं है, क्योंकि यह बहुत सारे कबाड़ में लाएगा? और अगर जनता में से किसी ने भी इसे शामिल नहीं किया है ... तो इसे वितरण में क्यों भेजा गया है?
क्रिस बेक

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

1
@LightnessRacesinOrbit यदि आप इसे स्वयं उपयोग करने वाले नहीं हैं, तो इसका अस्तित्व PCH के साथ कैसे मदद करता है? या कुछ परिस्थितियों में PCH उद्देश्यों के लिए स्वचालित रूप से इस पर स्विच करने के लिए पर्याप्त स्मार्ट है?
डैनियल एच

2
@LightnessRacesinOrbit "यह" सार्वजनिक API "का हिस्सा नहीं है या उपयोग के लिए नहीं है।" पूरी तरह से गलत है, यह सार्वजनिक उपयोग के लिए है, एक पूर्वनिर्धारित हेडर के रूप में। Libstdc ++ (प्री) संकलन और उस हेडर का एक पूर्व-संकलित संस्करण स्थापित करता है, इसलिए यदि आप इसे शामिल करते हैं तो G ++ वास्तव में bits/stdc++.h.gchइसके बजाय, पूर्व-निर्मित संस्करण शामिल होगा । यह मौजूद है क्योंकि इसे मौजूद होना है ताकि इसके पहले से तैयार संस्करण को उत्पन्न किया जा सके।
जोनाथन वेकली

जवाबों:


310

सहित <bits/stdc++.h>, स्टैक ओवरफ्लो पर देखने के लिए एक तेजी से सामान्य बात प्रतीत होती है, शायद वर्तमान शैक्षणिक वर्ष में राष्ट्रीय पाठ्यक्रम में कुछ नया जोड़ा गया है।

मुझे लगता है कि फायदे इस प्रकार दिए गए हैं:

  • आपको केवल एक #includeपंक्ति लिखने की आवश्यकता है
  • आपको यह देखने की आवश्यकता नहीं है कि सब कुछ किस मानक हेडर में है

दुर्भाग्य से, यह एक आलसी हैक एक जीसीसी आंतरिक हेडर के बजाय सीधे की तरह अलग-अलग मानक हेडर नामकरण है, <string>, <iostream>और <vector>। यह पोर्टेबिलिटी को बर्बाद करता है और भयानक आदतों को बढ़ावा देता है।

नुकसान में शामिल हैं:

  • यह शायद केवल उस कंपाइलर पर काम करेगा
  • आपके पास इसका उपयोग करने पर यह पता नहीं है कि यह क्या करेगा, क्योंकि इसकी सामग्री एक मानक द्वारा निर्धारित नहीं है
  • यहां तक ​​कि अपने कंपाइलर को केवल अपने अगले संस्करण में अपग्रेड करने से आपका प्रोग्राम टूट सकता है
  • हर एक मानक हेडर को आपके स्रोत कोड के साथ पार्स और संकलित किया जाना चाहिए, जो धीमा है और निश्चित संकलन सेटिंग्स के तहत एक भारी निष्पादन योग्य है।

यह मत करो!


अधिक जानकारी:

Quora क्यों खराब है इसका उदाहरण:


77
"शायद कुछ नव वर्तमान शैक्षणिक वर्ष में एक राष्ट्रीय पाठ्यक्रम में जोड़ा" ब्लाइंड अंधा :( अग्रणी
को पुनः स्थापित मोनिका

14
@ कुबाओबर: बिल्कुल सही।
ऑर्बिट

31
बस एक और सवाल में एक वर्महोल के माध्यम से यहां आया, बहुत अच्छा। इस शिक्षण की आदत को और भी बदतर बना दिया जाता है, यह आमतौर पर एक प्रत्यक्ष द्वारा पालन किया जाता है using namesapce std;। बस और लगभग हर अच्छी पहचानकर्ता में दो पंक्तियों का उपयोग किया जाता है। अविश्वसनीय रूप से निराशा होती है कि इसे पढ़ाया जा रहा है।
स्टोरीटेलर - Unslander मोनिका

6
कोरा उदाहरण के बारे में, यह समय के साथ स्थानांतरित हो सकता है। मैंने आज पृष्ठ देखा है और ऑनलाइन बिटिंग प्रतियोगिता के विशिष्ट संदर्भ में <बिट्स / stdc ++। H> दोनों के पेशेवरों और विपक्षों को सूचीबद्ध किया है। मुझे उनका निष्कर्ष ठीक-ईश लगता है।
YSC

3
@EvgeniSergeev: 2KiB अपने प्रभाव को निर्धारित करने की कोशिश करते समय बहुत सारे कोड, डेटा, प्रतीक सूचना आदि है। क्या आप सब कुछ समझ रहे हैं जो जोड़ा जा रहा है? अपने कंपाइलर के लिए? वर्तमान रिलीज? बीच में सभी रिलीज? सभी भविष्य के रिलीज? यदि आपको सुविधा और शुद्धता के बीच निर्णय लेने की आवश्यकता है, तो केवल एक ही वैध विकल्प है।
IInspectable

47

क्यों? क्योंकि इसका उपयोग ऐसे किया जाता है जैसे कि यह C ++ मानक हेडर माना जाता है, लेकिन कोई भी मानक इसका उल्लेख नहीं करता है। तो आपका कोड निर्माण से गैर-पोर्टेबल है। आप इसे cppreference पर कोई भी दस्तावेज़ नहीं पाएंगे । तो यह मौजूद नहीं हो सकता है। यह किसी की कल्पना का एक अनुमान है :)

मैंने अपने हॉरर और अविश्वास की खोज की है - कि एक प्रसिद्ध ट्यूटोरियल साइट है जहां हर C ++ उदाहरण में इस हेडर को शामिल करना प्रतीत होता है । दुनिया पागल है। यही प्रमाण है।


किसी को भी इस तरह के "ट्यूटोरियल" लिखने के लिए

कृपया इस शीर्ष लेख का उपयोग करना बंद करें। इसके बारे में भूल जाओ। इस पागलपन का प्रचार न करें। यदि आप यह समझने के लिए तैयार नहीं हैं कि ऐसा करना गलत क्यों है , तो इसके लिए मेरा शब्द लें। मैं किसी भी चीज़ पर अधिकार के एक व्यक्ति के रूप में नहीं माना जा रहा हूँ, और मैं शायद आधे समय से भरा हुआ हूँ, लेकिन मैं केवल इस एक मामले में अपवाद बनाऊँगा। मैं दावा करता हूं कि मुझे पता है कि मैं यहां किस बारे में बात कर रहा हूं। मुझे मेरे शब्द पर ले लो। मैं तुम्हें फंसाता हूं।

पीएस मैं अच्छी तरह से घृणित "शिक्षण मानक" की कल्पना कर सकता हूं जहां यह दुष्ट विचार हो सकता है, और जिन परिस्थितियों के कारण यह हुआ। सिर्फ इसलिए कि ऐसा लगता है कि इसके लिए एक व्यावहारिक आवश्यकता है जो इसे स्वीकार्य नहीं बनाती है - रेट्रोस्पेक्ट में भी नहीं।

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


35

एक स्टैक एक्सचेंज साइट है जिसे प्रोग्रामिंग पजल्स एंड कोड गोल्फ कहा जाता है । प्रोग्रामिंग पहेली उस साइट पर की इस परिभाषा फिट पहेली :

एक खिलौना, समस्या, या अन्य अंतर्ज्ञान को सरलता या रोगी के प्रयास से हल करने के लिए कठिनाइयों को प्रस्तुत करने के द्वारा डिज़ाइन किया गया।

वे मनोरंजन करने के लिए डिज़ाइन किए गए हैं, न कि इस तरह से कि एक कामकाजी प्रोग्रामर को अपने दैनिक काम में आने वाली वास्तविक दुनिया की समस्या से चकित किया जा सकता है।

कोड गोल्फ "एक प्रकार की मनोरंजक कंप्यूटर प्रोग्रामिंग प्रतियोगिता है जिसमें प्रतिभागी सबसे कम संभव स्रोत कोड को प्राप्त करने का प्रयास करते हैं जो एक निश्चित एल्गोरिथ्म को लागू करता है।" PP & CG साइट के उत्तरों में, आप देखेंगे कि लोग अपने उत्तरों में बाइट्स की संख्या निर्दिष्ट करते हैं। जब उन्हें कुछ बाइट्स से दाढ़ी बनाने का एक तरीका मिल जाता है, तो वे मूल संख्या पर हमला करेंगे और नया रिकॉर्ड करेंगे।

जैसा कि आप उम्मीद कर सकते हैं, कोड गोल्फिंग चरम प्रोग्रामिंग भाषा का दुरुपयोग करता है। एक अक्षर का चर नाम। कोई व्हाट्सएप नहीं। पुस्तकालय कार्यों का रचनात्मक उपयोग। अप्राकृतिक सुविधाएँ। नॉनस्टैंडर्ड प्रोग्रामिंग प्रैक्टिस। हैकिंग को याद करते हुए।

यदि एक प्रोग्रामर ने गोल्फ-स्टाइल कोड वाले काम पर एक पुल अनुरोध प्रस्तुत किया, तो इसे अस्वीकार कर दिया जाएगा। उनके सहकर्मी उन पर हंसते थे। उनका मैनेजर एक चैट के लिए उनके डेस्क से गिर जाता था। फिर भी, प्रोग्रामर पीपी एंड सीजी को जवाब प्रस्तुत करके खुद को खुश करते हैं।

इससे क्या लेना-देना है stdc++.h? जैसा कि दूसरों ने बताया है, इसका उपयोग करना आलसी है। यह गैर-पोर्टेबल है, इसलिए आपको नहीं पता कि यह आपके कंपाइलर या आपके कंपाइलर के अगले संस्करण पर काम करेगा या नहीं। यह बुरी आदतों को बढ़ावा देता है। यह गैर-मानक है, इसलिए आपके कार्यक्रम का व्यवहार आपकी अपेक्षा से भिन्न हो सकता है। यह संकलन समय और निष्पादन योग्य आकार बढ़ा सकता है।

ये सभी वैध और सही आपत्तियां हैं। तो कोई इस राक्षसी का उपयोग क्यों करेगा?

यह पता चला है कि कुछ लोगों को कोड गोल्फ के बिना प्रोग्रामिंग पहेलियाँ पसंद हैं । वे एक साथ मिलते हैं और ACM-ICPC, Google कोड Jam, और Facebook हैकर कप, या Topcoder और Codeforces जैसी साइटों पर प्रतिस्पर्धा करते हैं। उनकी रैंक प्रोग्राम की शुद्धता, निष्पादन की गति और वे कितनी तेजी से समाधान प्रस्तुत करते हैं, पर आधारित है। निष्पादन की गति को अधिकतम करने के लिए, कई प्रतिभागी C ++ का उपयोग करते हैं। कोडिंग गति को अधिकतम करने के लिए, उनमें से कुछ का उपयोग करें ।stdc++.h

क्या यह एक अच्छा विचार है? चलो नुकसान की सूची की जाँच करें। पोर्टेबिलिटी? इससे कोई फर्क नहीं पड़ता क्योंकि ये कोडिंग इवेंट एक विशिष्ट संकलक संस्करण का उपयोग करते हैं जो प्रतियोगियों को पहले से पता है। मानकों का अनुपालन? कोड के ब्लॉक के लिए प्रासंगिक नहीं जिसका उपयोगी जीवन एक घंटे से कम है। संकलन समय और निष्पादन योग्य आकार? ये प्रतियोगिता के स्कोरिंग रूब्रिक का हिस्सा नहीं हैं।

तो हम बुरी आदतों से बचे हैं। यह एक वैध आपत्ति है। इस हेडर फ़ाइल का उपयोग करके, प्रतियोगी यह जानने का मौका लेने से बच रहे हैं कि कौन सी मानक हेडर फ़ाइल उनके प्रोग्राम में उपयोग की जाने वाली कार्यक्षमता को परिभाषित करती है। जब वे वास्तविक दुनिया कोड लिख रहे हैं (और उपयोग नहीं कर रहे हैं stdc++.h) तो उन्हें इस जानकारी को देखने में समय बिताना होगा, जिसका मतलब है कि वे कम उत्पादक होंगे। इसके साथ अभ्यास करने का नकारात्मक पक्ष है stdc++.h

यह सवाल उठाता है कि यह प्रतिस्पर्धी प्रोग्रामिंग में भाग लेने के लायक क्यों है अगर यह stdc++.hअन्य कोडिंग मानकों का उपयोग करने और उल्लंघन करने जैसी बुरी आदतों को प्रोत्साहित करता है । एक उत्तर यह है कि लोग इसे उसी कारण से करते हैं जब वे पीपी एंड सीजी पर कार्यक्रम पोस्ट करते हैं: कुछ प्रोग्रामर को गेम की तरह संदर्भ में अपने कोडिंग कौशल का उपयोग करना सुखद लगता है।

तो सवाल यह है कि क्या उपयोग करने के लिए stdc++.hनीचे आता है कि क्या एक प्रोग्रामिंग प्रतियोगिता में कोडिंग गति का लाभ बुरी आदतों से निकलता है जो एक का उपयोग करके विकसित हो सकता है।

यह सवाल पूछता है: "मुझे क्यों नहीं # शामिल होना चाहिए <bits/stdc++.h>?" मुझे एहसास है कि यह पूछा गया था और एक बिंदु बनाने के लिए उत्तर दिया गया था, और स्वीकृत उत्तर का उद्देश्य इस प्रश्न का वन ट्रू उत्तर होना है। लेकिन सवाल यह नहीं है कि "मुझे <bits/stdc++.h>उत्पादन कोड में क्यों शामिल नहीं होना चाहिए ?" इसलिए, मुझे लगता है कि अन्य परिदृश्यों पर विचार करना उचित है जहां उत्तर अलग हो सकता है।


5
मैंने पहले से ही उत्थान किया है, लेकिन यह इंगित करने के लायक हो सकता है कि "मज़े के लिए" प्रतिस्पर्धी प्रोग्रामिंग में भाग लेने का एक अच्छा कारण है। दूसरी ओर "संभावित नियोक्ताओं को प्रभावित करने के लिए" नहीं है - यह मेरे साथ आपके मामले को सक्रिय रूप से नुकसान पहुंचाएगा
मार्टिन बोनर

2
@MartinBonner मुझे पता है कि कुछ हायरिंग मैनेजर एक लाल झंडे के रूप में प्रतिस्पर्धी प्रोग्रामिंग अनुभव देखते हैं। लेकिन जब तक शीर्ष सॉफ्टवेयर कंपनियां अपने साक्षात्कारों में सीपी-शैली की समस्याओं का उपयोग करती हैं और नए रंगरूटों को खोजने के लिए प्रोग्रामिंग प्रतियोगिताएं चलाती हैं, तब तक सीपी इच्छुक डेवलपर्स के बीच लोकप्रिय रहेगा।
RedGreenCode

@RedGreenCode मैं एक प्रबंधक ($ DEITY का धन्यवाद) नहीं हूं, लेकिन मुझे कभी-कभी इच्छाओं को रखने पर प्रभाव पड़ता है। और मैं निश्चित रूप से "प्रतिस्पर्धी प्रोग्रामिंग" को एक विशाल लाल ध्वज के रूप में देखता हूं - एक फायदा नहीं
जेस्पर जुएल

3
@JesperJuhl यदि आपकी कंपनी में तकनीकी साक्षात्कारकर्ता अपने साक्षात्कारों में एल्गोरिदम पहेली का उपयोग करते हैं (कई करते हैं), जो प्रतिस्पर्धी प्रोग्रामिंग अनुभव वाले उम्मीदवारों को एक फायदा देता है। हो सकता है कि उम्मीदवारों के लिए तर्कसंगत विकल्प सीपी में भाग लेना हो, लेकिन अपने रिज्यूम / सीवी पर इसका उल्लेख करने से बचें।
RedGreenCode

2
हालांकि यह सच है कि यह हेडर कुछ प्रतिस्पर्धी प्रोग्रामिंग में उपयोग कर सकता है, यह बिल्कुल नहीं है कि यह कहां से आया है। यह एक कक्षा से आया है। और जिसने भी उस कक्षा में पढ़ाया, उसके पास प्रदूषित करने के लिए पर्याप्त प्रभाव था - कैस्केड के माध्यम से - जिसके बाद दसियों नहीं तो सैकड़ों छात्र (शिक्षकों और साथियों को शिक्षित करके जो तब अनजाने में, उस बीमारी को फैला रहे थे)। और अब वे छात्र भी ट्यूटोरियल के लिए एक जगह पर ट्यूटोरियल लिख रहे हैं। मैं बस एक कोने में रोना चाहता हूं। प्रतिस्पर्धी प्रोग्रामिंग साइटों को किसी भी गैर-मानक हेडर को अस्वीकार करने के लिए सिर्फ एक regex होना चाहिए ।
मोनिका

8

N4606 से, वर्किंग ड्राफ्ट, प्रोग्रामिंग लैंग्वेज C ++ के लिए मानक:

17.6.1.2 हेडर [हेडर]

  1. C ++ मानक लाइब्रेरी का प्रत्येक तत्व हेडर में घोषित या परिभाषित (उपयुक्त के रूप में) है।

  2. सी ++ मानक पुस्तकालय 61 सी ++ लाइब्रेरी हेडर प्रदान करता है, जैसा कि तालिका 14 में दिखाया गया है।

तालिका 14 - सी ++ लाइब्रेरी हेडर

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

वहां कोई <बिट्स / stdc ++। H> नहीं है। यह आश्चर्य की बात नहीं है, क्योंकि <बिट्स / ...> हेडर कार्यान्वयन विस्तार कर रहे हैं, और आमतौर पर चेतावनी देते हैं:

*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. 

<बिट्स / stdc ++। h> भी एक चेतावनी देता है:

*  This is an implementation file for a precompiled header.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.