C में अपनी खुद की हैडर फाइल बनाना


176

क्या कोई समझा सकता है कि शुरुआत से अंत तक एक सरल उदाहरण के साथ सी में हेडर फ़ाइल कैसे बनाई जाए।


24
क्या आपने C पर एक परिचयात्मक पुस्तक पढ़ी है? यहाँ एक ऑनलाइन है: publications.gbdirect.co.uk/c_book
ओलिवर चार्ल्सवर्थ

जवाबों:


299

foo.h

#ifndef FOO_H_   /* Include guard */
#define FOO_H_

int foo(int x);  /* An example function declaration */

#endif // FOO_H_

foo.c

#include "foo.h"  /* Include the header (not strictly necessary here) */

int foo(int x)    /* Function definition */
{
    return x + 5;
}

main.c

#include <stdio.h>
#include "foo.h"  /* Include the header here, to obtain the function declaration */

int main(void)
{
    int y = foo(3);  /* Use the function here */
    printf("%d\n", y);
    return 0;
}

जीसीसी का उपयोग कर संकलन करने के लिए

gcc -o my_app main.c foo.c

2
@Anu: मैं इस प्रारूप में नहीं पढ़ सकता। आप इस कोड को शामिल करने के लिए अपने मूल प्रश्न को संपादित कर सकते हैं।
ओलिवर चार्ल्सवर्थ

3
यह ध्यान देने योग्य है कि यह कोड काम नहीं करता है यदि आप इसे कोड द्वारा बटन बनाने का प्रयास करते हैं (कोड में "निर्माण और रन" :: उदाहरण के लिए ब्लॉक)। यह आपके लिए स्पष्ट लग सकता है, लेकिन मेरे लिए यह पहली बार हुआ है और मुझे यह पता लगाने में काफी समय लगा कि समस्या कहां है।
ज्येकोमन

5
@ जेकॉमोमन: ठीक है, समस्या कहाँ है ?
ओलिवर चार्ल्सवर्थ

2
किसी ने मुझे यह नहीं बताया कि "बिल्ड एंड रन" बटन सब कुछ के लिए पर्याप्त नहीं है। :-) यह मेरे लिए काफी आश्चर्य की बात थी (मैं नौसिखिया हूँ)। अब मुझे लगता है कि मुझे पहले कमांडलाइन या मेकफाइल्स का उपयोग करना सीखना होगा।
ज्येकोमन

1
मैं सोच रहा था कि क्या आप सभी आवश्यक फाइलों के संकलन के बारे में विस्तार से बता सकते हैं और foo.c को gcc प्रोग्राम तर्क में शामिल नहीं करना है। इस तकनीक को क्या कहा जाता है या आईडीई के बाहर कौन सा कार्यक्रम इसे पूरा कर सकता है - मेरे दिमाग में आता है
nf071590

26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H एक दोहरे समावेशी गार्ड के रूप में कार्य करता है।

फ़ंक्शन घोषणा के लिए, आपको केवल हस्ताक्षर को परिभाषित करने की आवश्यकता है, अर्थात्, पैरामीटर नाम के बिना, इस तरह से:

int foo(char*);

यदि आप वास्तव में चाहते हैं, तो आप पैरामीटर के पहचानकर्ता को भी शामिल कर सकते हैं, लेकिन यह आवश्यक नहीं है क्योंकि पहचानकर्ता का उपयोग केवल एक फ़ंक्शन के निकाय (कार्यान्वयन) में किया जाएगा, जो कि हेडर (पैरामीटर हस्ताक्षर) के मामले में, यह गायब है।

यह उस फ़ंक्शन को घोषित करता है fooजो एक स्वीकार करता है char*और एक रिटर्न देता है int

आपकी स्रोत फ़ाइल में, आपके पास होगा:

#include "my_header.h"

int foo(char* name) {
   //do stuff
   return 0;
}

वे फ़ंक्शन घोषणाओं या फ़ंक्शन प्रोटोटाइप के रूप में जाने जाते हैं , न कि "फ़ंक्शन हेडर"। हेडर आपके द्वारा शामिल की गई फाइलें हैं, न कि उनके अंदर की गई घोषणाएं।
जोनाथन वेकली

@JonathanWakely वे हेडर फाइलें हैं। नाम यह सब बताता है: हेडर फ़ाइलों में हेडर होते हैं। लेकिन प्रतिक्रिया के लिए धन्यवाद, इसने मुझे एक सेकंड के लिए सोचने पर मजबूर कर दिया।
फ्लेवियस

नहीं, हेडर स्वयं फाइलें हैं, न कि उन घोषणाओं में जो शामिल हैं। क्या आप "शीर्ष लेख" के अपने उपयोग का समर्थन करने के लिए एक भी सम्मानित संदर्भ पा सकते हैं? यह उदाहरण के लिए, K & R, C मानक, UNIX प्रोग्रामिंग पर्यावरण और विकिपीडिया द्वारा विरोधाभास है ।
जोनाथन वेकली

@JonathanWakely क्या आपने वास्तव में K & R पढ़ा है? TOC में एक खंड "4.5 हैडर फाइलें" और "हेडर फाइलें" इटैलिक में लिखा गया है, जो शब्दावली को दर्शाता है। बाकी किताब में लेखक कभी-कभी संक्षिप्तता के लिए सिर्फ "हेडर" लिखते हैं, लेकिन फ़ॉर्मेटिंग और टीओसी के माध्यम से यह स्पष्ट है कि सही शब्दावली क्या है। तो कृपया, एक पेशेवर बनें और जब आप गलत हों तो पहचान लें।
फ्लाविस

हां, और "हेडर" फाइलों को संदर्भित करता है , न कि उनमें घोषणाओं को। 2 संस्करण में मानक हेडर की चर्चा के लिए पृष्ठ 241 देखें, और पृष्ठ 33 जो परिभाषाओं और घोषणाओं के बारे में बात करता है (जिसे आप गलती से "फ़ंक्शन हेडर" कहते हैं) और स्पष्ट रूप से एक हेडर को परिभाषित करता है : "सामान्य अभ्यास externचर की घोषणाओं को इकट्ठा करना है और एक अलग फ़ाइल में फ़ंक्शन, जिसे ऐतिहासिक रूप से हेडर कहा जाता है , जो #includeप्रत्येक स्रोत फ़ाइल के सामने शामिल है । मानक पुस्तकालय के कार्यों, उदाहरण के लिए, हेडर में घोषित किए जाते हैं <stdio.h>। "
जोनाथन वेकली

8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}

void function();एक घोषणा के रूप में कॉल की तरह नहीं रोकता है function(42);घोषणाvoid में उपयोग करें जैसेvoid function(void);
chux - Reicaate Monica

5

शीर्ष लेख फ़ाइलों में आपके द्वारा .c या .cpp / .cxx फ़ाइल में परिभाषित फ़ंक्शंस के प्रोटोटाइप होते हैं (यदि आप c या ++ का उपयोग कर रहे हैं तो निर्भर करता है)। आप अपने .h कोड के चारों ओर # ifndef / # को परिभाषित करना चाहते हैं ताकि यदि आप एक ही .h को अपने कार्यक्रमों के विभिन्न भागों में दो बार शामिल करें, तो प्रोटोटाइप केवल एक बार ही शामिल हो।

client.h

#ifndef CLIENT_H
#define CLIENT_H

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize);


#endif /** CLIENT_H */

फिर आप .c फ़ाइल की तरह .h को कार्यान्वित करेंगे:

client.c

#include "client.h"

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize) {
 short ret = -1;
 //some implementation here
 return ret;
}

"ताकि यदि आप अपने कार्यक्रमों के विभिन्न भागों में एक ही बार .h को दो बार शामिल करते हैं, तो प्रोटोटाइप केवल एक बार ही शामिल होते हैं।" यह भ्रामक है। वे एक ही हेडर फाइल दो बार सहित से बचाव एक ही स्रोत फ़ाइल से (एक हेडर दो अलग स्रोत फ़ाइलों में दो बार सहित ठीक है, और आमतौर पर आवश्यक!) और फिर से की घोषणा समारोह प्रोटोटाइप एक समस्या नहीं है, फिर से परिभाषित करने के प्रकार और वैश्विक चर वह है जिसके खिलाफ पहरा होना चाहिए।
जोनाथन वेकली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.