.হ বা .সি / .সিপি অন্তর্ভুক্ত #?


118

সি বা সি ++ এর মধ্যে কোডিং করার সময় আমার কোথায় থাকা উচিত #include?

callback.h:

#ifndef _CALLBACK_H_
#define _CALLBACK_H_

#include <sndfile.h>
#include "main.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data);
void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data);

#endif

callback.c:

#include <stdlib.h>
#include <math.h>

#include "config.h"

#include "callback.h"
#include "play.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) {
  gint page;
  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->notebook));

  ...

সমস্ত কি অন্তর্ভুক্ত করা উচিত .h বা .c / .cpp, বা উভয়ই এখানে করা উচিত?


2
আমাকে এটি ঘুরিয়ে জিজ্ঞাসা করা যাক: কলব্যাকের মধ্যে sndfile.h এবং মেইন.এল রাখার সিদ্ধান্ত নেওয়ার জন্য আপনার মানদণ্ডটি কী ছিল ?
ওভেন এস

উত্তর:


161

আপনি যতটা পারেন এবং .cযতটা সম্ভব কম তে রাখুন .h। এর মধ্যে অন্তর্ভুক্তগুলি কেবল .cতখন অন্তর্ভুক্ত থাকে যখন একটি ফাইল সংকলিত হয় তবে এতে ব্যবহৃত .hপ্রতিটি ফাইল যা এটি ব্যবহার করে তা অন্তর্ভুক্ত করতে হয়।


6
সত্য, তবে #ifndef _CALLBACK_H_এর শীর্ষে, সংকলকটি এটি একাধিকবার প্রক্রিয়াকরণে প্রতিরোধ করে না?
হাইট্রোমো

11
@ user9379 এটি .c বা .cpp ফাইল প্রতি একাধিকবার অন্তর্ভুক্ত করা থেকে রোধ করবে। প্রতিটি .c বা .cpp ফাইল সাধারণত পৃথকভাবে পৃথকভাবে নির্মিত হয়, যার অর্থ একটি .h আপনার সংকলিত প্রতিটি .c বা .cpp ফাইলের জন্য পুনরায় পার্স করা হবে।
ব্রেন্ডন লং

2
আমি মনে করি যে যতটা সম্ভব সামান্য রাখার মূল কারণ .hহ'ল অন্তর্ভুক্তির লুপের কারণে কোনও ক্ষেত্রে ত্রুটি এড়ানো। উদাহরণ: দুটি শ্রেণীর বাস্তবায়নের জন্য একে অপরের প্রয়োজন, তবে তাদের ঘোষণার জন্য নয়। উভয় .cppএস এর মধ্যে অন্তর্ভুক্ত করা একটি ত্রুটি এড়ানো হবে।
কোডস্কোপ

1
@ কোয়েস্ট-সিট'অন্ট এটি কারণ হ'ল আপনি .h ফাইলগুলিতে কিছু নির্দিষ্ট জিনিস রাখতে পারবেন না । এই উত্তরটি কেন আপনার তুলনায় আরও কম রাখা উচিত।
ব্রেন্ডন লং

@ ব্রেন্ডনলং আমি দেখতে পেয়েছি, যদিও আমার মতে বেশ কয়েকবার একই শিরোনামটি অন্তর্ভুক্ত করে যদি আপনি সঠিক ম্যাক্রোগুলি কেবল একবার অন্তর্ভুক্ত না করে থাকেন তবে তাতে কিছু যায় আসে না। অতএব, আমি মনে করি যে কোডটি পরিবর্তন করে ভবিষ্যতে একটি ত্রুটি পেতে সম্ভাবনা হ্রাস করা আরও কম রাখার অর্থ।
কোডকস্কোপ

55

আপনি যখন অন্য শ। উদাহরণ স্বরূপ:

#ifndef MY_HEADER_H
#define MY_HEADER_H

#include <stdio.h>

void doStuffWith(FILE *f); // need the definition of FILE from stdio.h

#endif

উপরের উদাহরণের মতো শিরোনাম এ যদি শিরোলেখ B এর উপর নির্ভর করে তবে শিরোনাম A এ সরাসরি হেডার বি অন্তর্ভুক্ত করা উচিত। নির্ভরতাগুলি সন্তুষ্ট করতে .c ফাইলটিতে আপনার অন্তর্ভুক্ত করার আদেশ দেওয়ার চেষ্টা করবেন না (এটি, শিরোনাম A এর আগে শিরোনাম বি সহ); এটি ঘটতে অপেক্ষা করছিল একটি বড় অল 'গাদা জ্বলন্ত গাদা। আমি বলতে চাইছি। আমি বেশ কয়েকবার সেই মুভিতে এসেছি এবং এটি সবসময় টোকিওর সাথে শিখায় শেষ হয়েছিল।

হ্যাঁ, এর ফলে ফাইলগুলি একাধিকবার অন্তর্ভুক্ত হতে পারে তবে তাদের যদি একাধিক ঘোষণার / সংজ্ঞা ত্রুটি থেকে রক্ষা করার জন্য রক্ষী বাহিনী অন্তর্ভুক্ত থাকে তবে বিল্ড টাইমের কয়েক অতিরিক্ত সেকেন্ড চিন্তার মতো নয়। নির্ভরতা ম্যানুয়ালি ম্যানেজ করার চেষ্টা করা পাছার একটি ব্যথা।

অবশ্যই, আপনার যে ফাইলগুলির দরকার নেই সেগুলি অন্তর্ভুক্ত করা উচিত নয় ।


10

আপনার সিপিসিতে যতগুলি সম্ভব অন্তর্ভুক্ত করুন এবং কেবলমাত্র এইচপিএইচপি-র ফাইলের জন্য প্রয়োজন। আমি বিশ্বাস করি যে এটি সংকলনের গতি বাড়িয়ে তুলতে সহায়তা করবে, কারণ এইচপিএইচ ফাইলগুলি কম সংশ্লেষিত হবে।

অন্তর্ভুক্তি নির্ভরতা শৃঙ্খলাটিকে আরও কমাতে আপনার এইচপিপি ফাইলে ফরওয়ার্ড ডিক্লেয়ারেশনগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন ।


1
ওও। ফরোয়ার্ড ঘোষণাপত্রটি আকর্ষণীয়।
ব্রেন্ডন লং

পরম্প্পা, অগ্রাহ্য ঘোষণাগুলি বিজ্ঞপ্তি রেফারেন্স পরিস্থিতিতে খুব কার্যকর are তবে তারা কি অন্যান্য পরিস্থিতিতে একটি ভাল অনুশীলন হবে? (আমি সি ++ এ নতুন, তাই আমি সততার সাথে জিজ্ঞাসা করছি)
জাজান

5

যদি আমি #include <callback.h>, #includeআমার কোডটি সংকলিত করতে আমার প্রচুর অন্যান্য শিরোনামের ফাইল থাকতে চাই না। এর callback.hবিপরীতে সংকলনের জন্য আপনার প্রয়োজনীয় সমস্ত কিছু অন্তর্ভুক্ত করা উচিত। তবে এর চেয়ে বেশি কিছু নেই।

আপনার শিরোনাম ফাইলে (যেমন class GtkButton;) তে ফরওয়ার্ড ডিক্লেয়ারেশন ব্যবহার করা যথেষ্ট কিনা তা বিবেচনা করুন , যা আপনাকে #includeহেডারে নির্দেশকের সংখ্যা হ্রাস করতে দেয় (এবং পরিবর্তে আমার সংকলনের সময় এবং জটিলতা)।


আমি একমত নই এইচ ফাইলগুলিতে পুরো বিশ্বকে অন্তর্ভুক্ত করে নির্ভরতা শৃঙ্খলা বাড়ায় এবং তাই সময় সংকলন করে।
জন ডিবলিং

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