2009-01-14 6 views
38

मैं gmock के साथ खेल रहा हूं और ध्यान दिया कि इसमें यह रेखा है:आप फ़ाइल एक्सटेंशन को # अंतर्निहित निर्देश में कब छोड़ सकते हैं?

#include <tuple> 

मैं tuple.h की अपेक्षा करता।

एक्सटेंशन को बाहर करने के लिए यह कब ठीक है, और क्या यह निर्देश को एक अलग अर्थ देता है?

उत्तर

58

सी ++ मानक हेडर एक "ज" प्रत्यय नहीं है। मेरा मानना ​​है कि कारण यह है कि कई अलग-अलग पूर्व-मानक कार्यान्वयन थे जो मानक टूट जाएंगे। तो उन विक्रेताओं की आवश्यकता के बजाय उनके बाहर निकलने वाले "iostream.h" (उदाहरण के लिए) हेडर मानक मानकों के अनुरूप है (जो उनके मौजूदा उपयोगकर्ता के कोड को तोड़ देगा), मानक समिति ने फैसला किया कि वे प्रत्यय छोड़ देंगे (जो, मुझे विश्वास नहीं है तो मौजूदा कार्यान्वयन पहले से ही किया गया था)।

इस तरह, मौजूदा, गैर मानक कार्यक्रम विक्रेता के गैर-मानक पुस्तकालयों का उपयोग करना जारी रखेंगे। जब उपयोगकर्ता अपने प्रोग्राम मानकों को अनुपालन करना चाहता था, तो वे "चरण" प्रत्यय को छोड़ने के लिए "#include" निर्देश को बदलने के लिए एक कदम उठाएंगे।

तो

#include <iostream>  // include the standard library version 
#include <iostream.h> // include a vendor specific version (which by 
         //  now might well be the same) 

के रूप में अन्य उत्तर का उल्लेख किया है, गैर मानक पुस्तकालयों के लेखकों या तो नामकरण सम्मेलन चुन सकते हैं, लेकिन मुझे लगता था कि वे "ज" या ".hpp" उपयोग जारी रखना चाहते हैं (बूस्ट किया के रूप में किया गया है) एक जोड़े कारणों के लिए:

  1. & अगर जब पुस्तकालय मानकीकृत हो जाता है, मानक संस्करण स्वचालित रूप से पिछले, अमानक एक (सभी संभावना में टूटा उपयोगकर्ता कोड के कारण) पर हावी नहीं होगा
  2. यह एक सम्मेलन (अधिक या कम) लगता है कि प्रत्यय के बिना हेडर मानक पुस्तकालय हैं, और प्रत्यय वाले (पुराने सी हेडर के अलावा) गैर-मानक हैं।

नोट है कि एक समान समस्या हुआ जब समिति एसटीएल के हैश नक्शे जोड़ने के लिए गया था - उन्होंने पाया वहाँ पहले से ही कर रहे हैं कि कई (भिन्न) hash_map कार्यान्वयन है कि मौजूद है, तो बजाय एक मानक एक है कि टूट जाता है के साथ आ आज वहां बहुत सी चीजें हैं, वे मानक कार्यान्वयन "unordered_map" कह रहे हैं। नामस्थानों को हुप्स के माध्यम से इस प्रकार के कूदने से रोकने में मदद की जानी चाहिए, लेकिन यह बहुत अच्छी तरह से काम नहीं कर रहा था (या पर्याप्त रूप से पर्याप्त उपयोग किया जा सकता है) ताकि वे बहुत सारे कोड को तोड़ने के बिना अधिक प्राकृतिक नाम का उपयोग कर सकें।

ध्यान दें कि 'सी' हेडर के लिए, सी ++ आपको <cxxxxxx> या <xxxxxx.h> संस्करण शामिल करने की अनुमति देता है। वह जो 'सी' से शुरू होता है और उसके पास ".h" प्रत्यय नहीं है, उसकी घोषणा std नेमस्पेस (और संभवतः वैश्विक नामस्थान) में है, ".h" प्रत्यय वाले नाम वैश्विक नामस्थान (कुछ कंपाइलर भी नाम std नामस्थान में रखें - यह मेरे लिए अस्पष्ट है अगर यह मानकों का अनुपालन करता है, हालांकि मुझे नुकसान दिखाई नहीं देता है)।

+8

कोई अन्य (शायद मुख्य कारण नहीं है :)) तथ्य यह इंगित करना होगा कि मानक शीर्षलेखों को फाइलों की आवश्यकता नहीं है। इसलिए वे ".h" को छोड़ने का फैसला कर सकते थे, क्योंकि यह फ़ाइल एक्सटेंशन का सुझाव देता है। –

+4

यह एएनएसआई सी 1 9 8 9 के बाद से सच रहा है, जो एक फुटनोट के रूप में है: "एक हेडर आवश्यक रूप से एक स्रोत फ़ाइल नहीं है ..." वैसे - क्या किसी को एक कंपाइलर के बारे में पता है जो मानक शीर्षकों के लिए सामान्य स्रोत फ़ाइलों के अलावा कुछ करता है ? –

+1

@MichaelBurr प्रीकंपिल्ड हेडर्स उस बिल को फिट नहीं करेगा? –

16

फ़ाइल तो tuple नाम पर है, तो आप अगर यह tuple.h नामक #include <tuple> करने की जरूरत है तो आप की जरूरत #include <tuple.h>

को ऐसा लगता है कि के रूप में सरल है। आप कोई एक्सटेंशन नहीं छोड़ रहे हैं।

15

इसमें एक फ़ाइल भी शामिल है जिसे "टुपल" नाम दिया गया है - फ़ाइल में स्वयं एक्सटेंशन का अभाव है।

सी ++ के लिए मूल मानक में फ़ाइलें शामिल हैं .h एक्सटेंशन के बिना उन्हें नाम देना; कई पुस्तकालय लेखक इस मानक (एसटीएल, आदि) का पालन करते हैं लेकिन कुछ नहीं करते हैं।

+1

जहाँ तक मुझे पता है, बूस्ट फ़ाइलों में .hpp एक्सटेंशन है। – mannicken

+1

ओह! आप सही हे। मैं जवाब ठीक कर दूंगा। – Crashworks

4

मेरी समझ यह थी कि # शामिल टुपल tuple.h को "पॉइंट" करेगा।

चेक इस बाहर: iostream vs iostream.h

+1

लिंक किया गया लेख काफी अच्छा है। –

+1

संकलक यह तय कर सकता है कि यह करता है। ओएस के लिए फ़ाइल पथ को पूरा करने के लिए स्रोत कोड में स्ट्रिंग से रूपांतरण संकलक तक है। निर्देशिका उपसर्ग काफी आम है, लेकिन प्रत्यय एक्सटेंशन – MSalters

+1

बहुत रोचक आलेख नहीं है, thx –

6

कुछ खास नहीं चल रहा है। फ़ाइल को बस tuple नाम दिया गया है।

इसका कारण ... मानक लाइब्रेरी शीर्षलेखों में namespace एस की वजह से कोई फ़ाइल विस्तार नहीं है।

नेमस्पेस, सी ++ 98 मानक के साथ खेल में देर सी ++ मानक को जोड़ा गया। std नाम स्थान है कि सभी मानक पुस्तकालय संस्थाओं में रहते सहित

जब मानक पुस्तकालय std नाम स्थान में ले जाया गया गया इसका मतलब था कि सभी मौजूदा सी ++ कोड तोड़ देंगे क्योंकि यह सब पुस्तकालय वैश्विक नामस्थान में होने की उम्मीद है। समाधान पुरानी "डॉट-एच" हेडर फाइलों को अकेला छोड़ना था और उन फ़ाइलों में नेमस्पेस्ड लाइब्रेरी प्रदान करना था जिनमें कोई एक्सटेंशन नहीं था।

इस तरह, पुराने कोड है कि #include<iosteam.h> एक वैश्विक cout जबकि नए कोड #include<iostream> सकता है उम्मीद है और एक std::cout उम्मीद कर सकता हैं।

4

पहले से पोस्ट किए गए ठीक उत्तरों के अतिरिक्त, यह ध्यान दिया जाना चाहिए कि सी ++ मानक को "iostream" या यहां तक ​​कि "iostream.h" नामक फ़ाइल को पढ़ने के लिए "#शामिल करें" निर्देश की आवश्यकता नहीं है। इसे "फ़ज़बॉल" नाम दिया जा सकता है। या, कोई संबंधित फ़ाइल मौजूद नहीं हो सकती है और परिभाषाएं संकलक में बनाई गई हैं और निर्देश शामिल करके सक्रिय की गई हैं।

-3

लोग,

मुझे लगता है कि सौदा है: # शामिल <lib> allways पूर्व pends/lib/खोज पथ (ज infrerred है) जबकि # शामिल < > lib.h खोजों के लिए शामिल बस -आई < पथनाम >।

कृपया ध्यान दें कि मैं गलत हो सकता हूं ... यह ठीक है कि मुझे लगता है कि यह काम करता है (सोलारिस पर फोर्ट सीसी में)।

+2

आपको गलत लगता है - मानक C++ खोज पथ निर्दिष्ट नहीं करता है। –

+1

स्वीकार करते हुए संक्षेप में -1 से बचा जाता है कि आप गलत हो सकते हैं ... जो आप हैं। :-) –

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