2013-08-25 9 views
8

तो मैं हेड फर्स्ट सी में साथ चल रहा हूं और हम एक अध्याय पर हैं जहां हम एक साथ कई फाइलों को संकलित करना सीखते हैं। उनमें से एक encrypt.c है।मुझे उसी नाम की .c फ़ाइल में .h हेडर फ़ाइल क्यों शामिल करने की आवश्यकता है?

#include "encrypt.h" 


void encrypt(char *message) 
{ 
    char c; 
    while (*message) { 
    *message = *message^31; 
    message++; 
    } 
} 

encrypt.h फ़ाइल अंत में अर्धविराम से पहली पंक्ति को दोहराता है, तो क्यों मैं इसे ज़रूरत है? मैं समझता हूं कि इसे परिभाषित करने से पहले किसी फ़ंक्शन का उपयोग करने की समस्या को ठीक करने के लिए मुझे हेडर फ़ाइलों की आवश्यकता क्यों होगी, इसलिए मैं इसे encrypt.c का उपयोग करने वाली फ़ाइल में शामिल कर सकता हूं, लेकिन मुझे encrypt.c के अंदर इसकी आवश्यकता क्यों होगी? क्या यह सिर्फ उन कारणों में से एक है?

+0

आप इसे परिभाषित करने से पहले किसी फ़ंक्शन का उपयोग नहीं कर सकते हैं। आप फ़ंक्शन के लिए हेडर घोषित कर सकते हैं और फिर इसे परिभाषित करने के बाद इसका उपयोग कर सकते हैं। लेकिन एक हेडर फ़ाइल आपको सुपरसियर प्रदान नहीं करती है जिससे यह आपको अविकसित फ़ंक्शन का उपयोग करने की अनुमति देती है। – smac89

+3

इस विशेष उदाहरण में प्रासंगिक नहीं है, लेकिन हेडर फाइलें अक्सर 'टाइपपीफ' और 'स्ट्रक्चर' और सभी प्रकार की चीजों को परिभाषित करती हैं जो उस शीर्षलेख में घोषित फ़ंक्शंस का उपयोग करना चाहती हैं। –

+0

मेरे पास कुछ अन्य भी हैं। इस पुस्तक में दोष हैं लेकिन वे सभी करते हैं। – punstress

उत्तर

16

encrypt.c की सामग्री को उनकी संपूर्णता में दिखाया जाता है, तो आप नहीं जरूरत हैडर से करते हैं। लेकिन अभी भी इसे शामिल करना एक अच्छा विचार है क्योंकि:

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

मुझे आपका दूसरा बिंदु पसंद है। पुस्तक ने आपके पहले कार्यों को लाया जो पारस्परिक रूप से एक दूसरे को बुलाते हैं, इसलिए पिंग कॉल पोंग और पोंग कॉल पिंग कहते हैं, और मैं समझता हूं कि हेडर कैसे हल करेगा, लेकिन मैंने सोचा, यहां हमारे पास केवल एक कार्य है, क्या यह सिर्फ मुझे आदत में? – punstress

+1

@punstress: संक्षेप में यह है। और इसमें प्रवेश करने की एक अच्छी आदत है। ;-) – Jon

+0

@ जोन संक्षेप में यह हमेशा कार्यान्वयन से इंटरफेस को अलग करने के लिए एक अच्छा अभ्यास है, है ना? – NlightNFotis

6

आप सही हैं, अगर यह सब encrypt.h घोषित करता है, तो आपको इसे .c फ़ाइल में शामिल करने की आवश्यकता नहीं है।

आप ज्यादातर इसे स्थिरता के लिए करते हैं।

+0

मैंने सोचा कि यह ऐसा कुछ था, धन्यवाद। – punstress

4

प्रोटोटाइप है कल्पना कीजिए कि आप void encrypt(char *message, int i) { }

को encrypt.c बदल आप नहीं लगाते हैं तो encrypt.h आप अन्य कि नोटिस नहीं होगा नए पैरामीटर को पास करने के लिए आपके एप्लिकेशन में फाइलें अपडेट नहीं की गई हैं। यदि आप एक ही समय में एन्क्रिप्ट.h और एन्क्रिप्ट.c को अद्यतन करते हैं तो संकलक आपके लिए जांच कर सकता है।

+0

पिछले साल से इसे फिर से पढ़ रहा था, और मुझे आपकी बात पसंद है। धन्यवाद। – punstress

1

यह अच्छी शैली है। कभी-कभी, फ़ंक्शन उपयोग के साथ फ़ंक्शन कार्यान्वयन और सी-फ़ाइल के साथ सी-फ़ाइल आम घोषणाओं को साझा करता है - प्रकार/संरचनाएं, यह शेयर एच-फाइल पर घोषणाएं होती हैं। पूर्व के लिए ।

[enc.h] 
typedef enum {S,F} Res; 
EN encode(); 

[enc.c] 
#include "enc.h" 
Res encode() { ... } 

[other.c] 
Res res; 
res = encode(); 
0

फिर आप एक और * .c-file में शीर्षलेख शामिल करते हैं, तो संकलक इस तरह से जानता है कि कहीं और फ़ंक्शन परिभाषा है।

इस तरह IST:

#include <stdio.h> 

int main (void) 
{ 
    afun(); 
    return 0; 
} 

void afun (void) 
{ 
    printf("hello\n"); 
} 

अब संकलक क्या afun() मुख्य कार्य में से कोई लेना देना नहीं जानता है। क्योंकि यह परिभाषित नहीं किया गया था। तो यह एक कंपाइलर त्रुटि में नेतृत्व करेंगे।

तो तुम शुरुआत में या सर्वप्रथम प्रयोग bevore घोषणा जोड़ें:

#include <stdio.h> 

void afun(void); 

int main (void) 
{ 
    afun(); 
    return 0; 
} 

void afun (void) 
{ 
    printf("hello\n"); 
} 

संकलक afun की deklaration जानता है और anythere किसी और को उम्मीद समारोह परिभाषित किया गया है पता है। हेडर फाइलों के साथ precompiled सी-कोड का उपयोग करना संभव है। कंपाइलर की एकमात्र चीज की आवश्यकता है फ़ंक्शन का विकृति।

+1

ओपी ने कहा "मुझे समझ में आता है कि मुझे इसकी परिभाषा से पहले किसी फ़ंक्शन का उपयोग करने की समस्या को ठीक करने के लिए हेडर फाइलों की आवश्यकता क्यों होगी" –

+0

हां मैं दिखाऊंगा: शीर्षलेख फ़ाइलों के साथ प्रीकंपील्ड सी का उपयोग करना संभव है -code। – Alex44

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