2010-02-02 9 views
15

संभावित डुप्लिकेट:
[C] Header per source file.
In C++ why have header files and cpp files?
C++ - What should go into an .h file?सी में हेडर फाइलों का क्या बिंदु है?

एकमात्र कारण हेडर फाइल सी में मौजूद है तो एक डेवलपर जल्दी से देख सकते हैं कि कार्यों उपलब्ध हैं, और क्या तर्क है वे ले सकते हैं? या यह कंपाइलर के साथ कुछ करने के लिए है?

इस विधि का कोई अन्य भाषा क्यों उपयोग नहीं किया गया है? क्या यह सिर्फ मुझे है, या ऐसा लगता है कि फ़ंक्शन परिभाषाओं के 2 सेट होने से केवल त्रुटियों के लिए अधिक रखरखाव और अधिक जगह हो जाएगी? या हेडर फाइलों के बारे में जानना सिर्फ कुछ सी डेवलपर को पता होना चाहिए?

+1

इस http://stackoverflow.com/questions/1167875/c-header-per-source-file का पहला जवाब जो आप चाहते हैं उसे कवर करता है। –

+1

एक और http://stackoverflow.com/questions/333889 –

+1

और http://stackoverflow.com/questions/1945846/c-what-should-go-into-an-h-file ... वास्तव में, यह क्यों है 3 बार मतदान किया? – MSalters

उत्तर

20

शीर्षलेख फ़ाइलों को घोषित करने वाले कार्यों और चर घोषित करने की आवश्यकता है। हो सकता है कि आपके पास सभी पर परिभाषाओं (= .c फ़ाइलों) तक पहुंच न हो; सी पुस्तकालयों में कोड के बाइनरी-केवल वितरण का समर्थन करता है।

+0

क्यों यह अंदर नहीं है यह जांचने के लिए सीधे सी फाइलों को शामिल नहीं किया गया है, यह वही है जो मुझे समझ में नहीं आता है। – chris

+0

@chris जैसा कि मैंने कहा था, इस बात की कोई आवश्यकता नहीं है कि आपके पास उस फ़ंक्शन के लिए स्रोत कोड हो जिसे आप कॉल करना चाहते हैं। और इस बात की कोई आवश्यकता नहीं है कि प्लेटफ़ॉर्म के बाइनरी प्रारूप में ऐसी जानकारी हो जो एक कंपाइलर पढ़ सके, यह ऐसा नहीं किया जाता है। शायद "बेवकूफ", लेकिन यह है कि यह कैसे है। – unwind

7

मुख्य कारण शीर्षलेख मौजूद हैं कई स्रोत फ़ाइलों के बीच घोषणाओं को साझा करना।

आप समारोह float *f(int a, int b) फ़ाइल a.c में परिभाषित किया गया और b.c और d.c में पुन: उपयोग किया है कहो। कंपाइलर को तर्कों की उचित जांच करने और मूल्यों को वापस करने की अनुमति देने के लिए आप या तो हेडर फ़ाइल में फ़ंक्शन प्रोटोटाइप डालते हैं और इसे .c स्रोत फ़ाइलों में शामिल करते हैं या आप प्रत्येक स्रोत फ़ाइल में प्रोटोटाइप दोहराते हैं।

एक ही के लिए typedef आदि

चला जाता है आप सकता है, सिद्धांत रूप में, प्रत्येक स्रोत फ़ाइल में एक ही घोषणा दोहराने है, यह एक असली दुःस्वप्न ठीक से प्रबंधन करने के लिए बन जाएगा।

कुछ भाषा एक ही दृष्टिकोण का उपयोग करती है। मुझे याद है कि टर्बोपास्कल इकाइयां बहुत अलग नहीं हैं। आप शुरुआत में use ... डाल देंगे ताकि सिग्नल सिग्नल हो कि आपको अन्य कार्यों को परिभाषित करने की आवश्यकता होगी। मुझे याद नहीं है कि क्या वह डेल्फी में भी पारित किया गया था।

10

कंपाइलर को हेडर फ़ाइलों में जानकारी की आवश्यकता है यह जानने के लिए कि कौन से फ़ंक्शंस, संरचनाएं आदि उपलब्ध हैं और उनका उपयोग कैसे करें।

सभी भाषाओं को इस तरह की जानकारी की आवश्यकता है, हालांकि वे विभिन्न तरीकों से जानकारी पुनर्प्राप्त करते हैं। उदाहरण के लिए, जावा कंपाइलर जानकारी को पुनर्प्राप्त करने के लिए कक्षा-फ़ाइल या जावा स्रोत कोड स्कैन करके ऐसा करता है।

जावा-मार्ग के साथ दोष यह है कि संकलक को संभावित रूप से इसकी स्मृति में अधिक जानकारी रखने की आवश्यकता होती है ताकि वह ऐसा कर सके। आज यह कोई बड़ा सौदा नहीं है, लेकिन सत्तर के दशक में, जब सी भाषा बनाई गई थी, तो स्मृति में उस जानकारी को रखना संभव नहीं था।

+0

ऐसा लगता है कि संकलित लोग अब भी हेडर फाइलों से परेशान नहीं हैं। तो क्या आप कहेंगे कि हेडर फाइलें आजकल अनावश्यक हैं अगर हम सी को फिर से बनाना चाहते हैं? – CMCDragonkai

2
  1. जानें कि आपके निपटारे में लाइब्रेरी में क्या है।
  2. प्रोग्राम को कंपाइलर के लिए काटने-आकार के टुकड़ों में विभाजित करें। सी फाइलों के एक मेगाबाइट को संकलित करने के साथ-साथ अधिकांश आधुनिक हार्डवेयर की पेशकश के मुकाबले ज्यादा संसाधन होंगे।
  3. संकलक लोड को कम करें।गहरे डेटाबेस इंजन के बारे में स्क्रीन डिस्प्ले प्रक्रियाओं में यह क्यों पता होना चाहिए? इसे केवल उन कार्यों के बारे में सीखने दें जिन्हें इसकी आवश्यकता है।
  4. अलग निजी और सार्वजनिक डेटा। यह उपयोग अक्सर नहीं होता है लेकिन आप सी में लागू कर सकते हैं सी ++ निजी फ़ील्ड्स का उपयोग करता है: प्रत्येक। सी फ़ाइल में दो .h फाइलें शामिल हैं, एक निजी सामान की घोषणाओं के साथ, दूसरा जो फ़ाइल से अन्य लोगों की आवश्यकता हो सकती है। नेमस्पेस संघर्ष का कम मौका, हेमेटाइजेशन के कारण सुरक्षित।
  5. वैकल्पिक विन्यास। मेकफ़ाइल तय करता है कि कौन से शीर्षलेख का उपयोग करना है, और एक ही कोड दो अलग-अलग शीर्षलेख फ़ाइलों को दो अलग-अलग प्लेटफ़ॉर्म प्रदान कर सकता है।

शायद अधिक।

+0

"गहरे डेटाबेस इंजन के बारे में स्क्रीन डिस्प्ले प्रक्रियाओं में यह क्यों पता होना चाहिए" ... हालांकि यदि यह कार्यान्वयन में मामला है, तो परियोजना के संसाधनों की तुलना में शायद बड़ी समस्याएं हो सकती हैं। –

+0

@ करलजी: आपने कभी एम्बेडेड डिवाइस प्रोग्राम नहीं किए हैं, है ना? –

+0

नहीं। ऐसे सिस्टम में स्टोरेज से दृश्य को मॉड्यूलर करना संभव नहीं है? या बस अव्यवहारिक? मुझे लगता है कि यदि संभव हो तो एक गहरी डेटाबेस इंजन को एक अलग एम्बेडेड सिस्टम या यहां तक ​​कि (नेटवर्क की गई) सेवा के लिए बेहतर ऑफलोड किया जाएगा। –

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