সি তে আপনার নিজস্ব শিরোনাম ফাইল তৈরি করা হচ্ছে


176

যে কেউ শুরু থেকে শেষ পর্যন্ত একটি সাধারণ উদাহরণ দিয়ে সিটিতে একটি শিরোলেখ ফাইলটি কীভাবে ব্যাখ্যা করবেন তা ব্যাখ্যা করতে পারেন।


24
আপনি কি সি তে একটি প্রবর্তক বই পড়েছেন? এখানে একটি অনলাইন রয়েছে: পাবলিকেশনস . 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
@ আনু: আমি এই ফর্ম্যাটে এটি পড়তে পারি না। আপনি এই কোডটি অন্তর্ভুক্ত করতে আপনার মূল প্রশ্নটি সম্পাদনা করতে পারেন।
অলিভার চার্লসওয়ার্থ

3
এই কোডটি কার্যকর হয় না যদি আপনি কেবল বোতাম দ্বারা কোডটি নির্মাণের চেষ্টা করেন (কোড :: ব্লকগুলিতে "উদাহরণস্বরূপ" বিল্ড করুন এবং চালান)। এটি আপনার কাছে সুস্পষ্ট বলে মনে হতে পারে তবে এটি আমার জন্য প্রথমবারের মতো ঘটেছে এবং সমস্যাটি কোথায় তা নির্ধারণ করতে আমার বেশ কিছুটা সময় নিয়েছিল।
জাইকোমন

5
@Jeyekomon: ওয়েল, যেখানে হয় সমস্যা?
অলিভার চার্লসওয়ার্থ

2
নুন আমাকে বলেছে যে "বিল্ড এন্ড রান" বোতামটি প্রতিটি কিছুর জন্য পর্যাপ্ত নয়। :-) আমার জন্য এটি বেশ অবাক হয়েছিল (আমি একজন নবাগত)। এখন আমি অনুমান করি আমাকে প্রথমে কমান্ডলাইন বা মেকফাইলগুলি ব্যবহার করতে শিখতে হবে।
জিয়েকোমন

1
আমি ভাবছিলাম যে আপনি কীভাবে সমস্ত প্রয়োজনীয় ফাইলগুলি সংকলন করবেন এবং জিসিসি প্রোগ্রাম আর্গুমেন্টে foo.c অন্তর্ভুক্ত করতে হবে না তা বিশদভাবে জানাতে পারছিলেন। এই কৌশলটি কী বলা হয় বা কোন প্রোগ্রাম আইডিই এর বাইরে এটি সম্পাদন করতে পারে - মেক মনে আসে
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;
}

এগুলি ফাংশন ঘোষণা বা ফাংশন প্রোটোটাইপ হিসাবে পরিচিত , "ফাংশন শিরোনাম" নয় ers শিরোনাম হ'ল ফাইলগুলি যা আপনি অন্তর্ভুক্ত করেছেন সেগুলির মধ্যে ঘোষণাপত্রগুলি নয়।
জোনাথন ওয়েকেলি

নিবন্ধন করুন নামটি সবই বলে: শিরোলেখ ফাইলগুলিতে শিরক থাকে। তবে প্রতিক্রিয়ার জন্য ধন্যবাদ, এটি আমাকে এক সেকেন্ডের জন্য ভাবতে বাধ্য করে।
ফ্ল্যাভিয়াস

নাহ, শিরোনামগুলি ফাইলগুলি নিজেই রয়েছে, তারা যে ঘোষণাপত্র রাখে তা নয়। আপনার "শিরোনাম" ব্যবহার ব্যাক আপ করার জন্য আপনি একটি একক নামী রেফারেন্স খুঁজে পেতে পারেন? উদাহরণস্বরূপ এটি কেঅ্যান্ডআর , সি স্ট্যান্ডার্ড, দ্য ইউএনএক্স প্রোগ্রামিং এনভায়রনমেন্ট এবং উইকিপিডিয়া দ্বারা বিরোধী
জোনাথন ওয়েকেলি

@ জোনাথন সত্যিই কি আপনি কে ও আর পড়েছেন? টিওসি-র একটি বিভাগ রয়েছে "4.5 হেডার ফাইলগুলি" এবং "শিরোলেখ ফাইলগুলি" ইটালিকগুলিতে রচিত যা পরিভাষা নির্দেশ করে। বইয়ের বাকী অংশে লেখকরা মাঝে মাঝে ব্রেভিটির জন্য কেবলমাত্র "শিরোনাম" লেখেন, তবে বিন্যাস এবং টিওসি-র মাধ্যমে এটি পরিষ্কার হয়ে গেছে যে সঠিক পরিভাষাটি কী। সুতরাং দয়া করে, পেশাদার হন এবং যখন আপনি ভুল হন তখন চিনুন।
ফ্ল্যাভিয়াস

হ্যাঁ, এবং "শিরোনাম" ফাইলগুলিকে বোঝায় , সেগুলির মধ্যে ঘোষণাপত্র নয়। দ্বিতীয় সংস্করণে স্ট্যান্ডার্ড শিরোনামগুলির আলোচনার জন্য পৃষ্ঠা 241 দেখুন এবং পৃষ্ঠা 33 যা সংজ্ঞা এবং ঘোষণার বিষয়ে কথা বলে (যা আপনি ভুল করে "ফাংশন শিরোনাম" বলে থাকেন) এবং পরিষ্কারভাবে একটি শিরোনামকে সংজ্ঞায়িত করেছে : "সাধারণ অনুশীলনটি externভেরিয়েবলের ঘোষণা সংগ্রহ এবং separate তিহাসিকভাবে একটি শিরোনাম বলা হ'ল separateতিহাসিকভাবে একটি পৃথক ফাইলের ফাংশন , যা #includeপ্রতিটি উত্স ফাইলের সামনের অংশে অন্তর্ভুক্ত থাকে standard উদাহরণস্বরূপ, স্ট্যান্ডার্ড লাইব্রেরির ফাংশনগুলি যেমন শিরোনামে ঘোষিত হয় <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

5

শিরোনাম ফাইলগুলিতে আপনি .c বা .cpp / .cxx ফাইলে সংজ্ঞায়িত ফাংশনগুলির জন্য প্রোটোটাইপগুলি থাকে (আপনি সি বা সি ++ ব্যবহার করছেন তা নির্ভর করে)। আপনি আপনার .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;
}

"যাতে আপনি যদি একই প্রোগ্রামে অন্তর্ভুক্ত করেন তবে আপনার প্রোগ্রামের বিভিন্ন অংশে দু'বার, প্রোটোটাইপগুলি কেবল একবার অন্তর্ভুক্ত করা হয়।" এটি বিভ্রান্তিকর। তারা একই উত্স ফাইল থেকে দু'বার একই হেডার ফাইল অন্তর্ভুক্ত করা থেকে রক্ষা করে (দুটি ভিন্ন উত্স ফাইলে দুবার একটি শিরোনাম সহ ঠিক আছে, এবং সাধারণত প্রয়োজন!) এবং ফাংশন প্রোটোটাইপগুলি পুনরায় ঘোষণার কোনও সমস্যা নয়, পুনরায় সংজ্ঞায়িত ধরণের এবং বৈশ্বিক ভেরিয়েবলগুলি যা থেকে রক্ষা করা আবশ্যক।
জোনাথন ওয়েকেলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.