বিবৃতি, শিরোনাম বা উত্স অন্তর্ভুক্ত কোথায়?


106

আমি কি শিরোনাম ফাইল বা উত্স ফাইলের মধ্যে অন্তর্ভুক্ত করা উচিত? যদি হেডার ফাইলটিতে বিবৃতিগুলি অন্তর্ভুক্ত থাকে তবে আমি যদি আমার উত্সে সেই শিরোলেখ ফাইলটি অন্তর্ভুক্ত করি, তবে আমার উত্স ফাইলটিতে আমার শিরোনামে অন্তর্ভুক্ত সমস্ত ফাইল থাকবে? বা আমি কেবল তাদের উত্স ফাইলটিতে কেবল তাদের অন্তর্ভুক্ত করব?


2
এসও-তে আগের অনেকগুলি নকল, যেমন সি ++ এ "অন্তর্ভুক্ত" করা উচিত
পল আর

উত্তর:


141

কেবল শিরোনামে পুট অন্তর্ভুক্ত থাকে যদি শিরোনাম নিজেই তাদের প্রয়োজন হয়।

উদাহরণ:

  • আপনার ফাংশন ফেরত টাইপ size_t। তারপরে হেডার ফাইলটিতে #include <stddef.h>in
  • আপনার ফাংশন ব্যবহার করে strlen। তারপর #include <string.h>মধ্যে উৎস ফাইল।

2
আমার ফাংশনটি যদি একটি আর্গুমেন্ট গ্রহণ করে size_t?
andrybak

একই প্রশ্নটি সি ++ তে প্রসারিত: আমার স্ট্রাক্ট / ক্লাসে যদি ক্ষেত্র / প্রকারের সদস্য থাকে size_tবা std::string?
andrybak


আমার একটি ওয়্যারিড পরিস্থিতি রয়েছে, সি ++ ক্লাস এ-এর অন্য একটি ক্লাস বিয়ের একটি অবজেক্ট রয়েছে এবং আমি বি হেডের ভিতরে বি হেডার সহ বি ঘোষণা এবং শেষ-আপ ব্যবহার করতে পারি না। (পয়েন্টার ব্যবহারে সমস্যা নেই)
শুভ

@ অ্যান্ড্রাইবাক আপনার সোর্স ফাইলগুলিতে আপনার শিরোনামের ফাইল অন্তর্ভুক্ত করা উচিত যাতে আপনার হেডারটি আপনার উত্সটি পেতে পারে gets
জেরেমি ত্রিফিলো

27

বছরের পর বছর ধরে এই সম্পর্কে বেশ কিছুটা মতবিরোধ রয়েছে। এক সময়, এটি প্রচলিত ছিল যে একটি শিরোনাম কেবল এটি সম্পর্কিত যে মডিউলটির সাথে সম্পর্কিত তা কেবলমাত্র ঘোষণা করে, তাই অনেকগুলি শিরোনামের নির্দিষ্ট প্রয়োজনীয়তা ছিল যে আপনি #includeএকটি নির্দিষ্ট শিরোনামের (একটি নির্দিষ্ট ক্রমে)। কিছু প্রচলিত সি প্রোগ্রামার এখনও এই মডেলটি অনুসরণ করে (ধর্মীয়ভাবে, কমপক্ষে কিছু ক্ষেত্রে)।

অতি সম্প্রতি, বেশিরভাগ শিরোনামকে এককভাবে তৈরি করার পক্ষে একটি আন্দোলন চলছে। যদি সেই শিরোনামটির অন্য কোনও প্রয়োজন হয় তবে শিরোনাম নিজেই তা পরিচালনা করে যা নিশ্চিত করে যে এটি যা প্রয়োজন তা অন্তর্ভুক্ত রয়েছে (সঠিক ক্রমে, যদি অর্ডার করার সমস্যাগুলি থাকে)। ব্যক্তিগতভাবে, আমি এটি পছন্দ করি - বিশেষত যখন শিরোনামগুলির ক্রমটি গুরুত্বপূর্ণ হতে পারে, সমস্যাটি আবার সমাধানের জন্য এটি ব্যবহার করে এমন প্রত্যেকের প্রয়োজনের পরিবর্তে, সমস্যাটি একবার সমাধান করে।

নোট করুন যে বেশিরভাগ শিরোনামে কেবলমাত্র ঘোষণা থাকতে হবে। এর অর্থ একটি অপ্রয়োজনীয় শিরোনাম যুক্ত করা (সাধারণত) আপনার চূড়ান্ত সম্পাদনকারীকে প্রভাবিত করে না। সবচেয়ে খারাপ যেটি ঘটে তা হ'ল এটি সংকলনটি কিছুটা ধীর করে দেয়।


2
সমস্ত শিরোনাম যদি দ্বিতীয় স্টাইলে লেখা থাকে তবে কোনও অর্ডার দেওয়ার সমস্যা নেই। শিরোনামগুলিতে ক্রম সংক্রান্ত ক্রমগুলি অর্পিত হওয়ার অর্থ সাধারণত হ'ল হেডারে আপনার প্রয়োজনীয় সমস্ত কিছু অন্তর্ভুক্ত করা হয়নি।
বিদায় SE

12

আপনার #includeগুলিটি হেডার ফাইলের হওয়া উচিত এবং প্রতিটি ফাইলের (উত্স বা শিরোনাম) #includeহেডারের ফাইলগুলির প্রয়োজন হওয়া উচিত । শিরোনাম ফাইলগুলির #includeসর্বনিম্ন হেডার ফাইলগুলি প্রয়োজনীয় হওয়া উচিত এবং উত্স ফাইলগুলিও হওয়া উচিত, যদিও এটি উত্স ফাইলগুলির জন্য গুরুত্বপূর্ণ নয়।

উত্স ফাইলে এটির #includeশিরোনামগুলি #includeএবং সেগুলি সর্বাধিক নীড়ের গভীরতা পর্যন্ত থাকবে head এই কারণেই আপনি #includeহেডার ফাইলগুলিতে অতিমাত্রায় চাই না : সংকলনটি ধীর করে দেওয়ার কারণে তারা কোনও উত্স ফাইলকে প্রচুর শিরোলেখের ফাইলের প্রয়োজন হতে পারে না।

এর অর্থ এটি সম্পূর্ণরূপে সম্ভব যে হেডার ফাইলগুলি দু'বার অন্তর্ভুক্ত থাকতে পারে এবং এটি কোনও সমস্যা হতে পারে। Traditionalতিহ্যবাহী পদ্ধতিটি হোল্ডার ফাইলগুলিতে "রক্ষকগুলি অন্তর্ভুক্ত করা" যেমন ফাইল foo.h এর জন্য এইভাবে রাখা হয়:

#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H
/* everything in header goes here */
#endif

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

6

কুড়ি বছরেরও বেশি সময় ধরে আমি যে পদ্ধতির বিকাশ করেছি তা হ'ল;

একটি গ্রন্থাগার বিবেচনা করুন।

একাধিক সি ফাইল, একটি অভ্যন্তরীণ এইচ ফাইল এবং একটি বহিরাগত এইচ ফাইল রয়েছে। সি ফাইলগুলির মধ্যে অভ্যন্তরীণ এইচ ফাইল অন্তর্ভুক্ত রয়েছে। অভ্যন্তরীণ এইচ ফাইলটিতে বাহ্যিক এইচ ফাইল অন্তর্ভুক্ত রয়েছে।

আপনি দেখতে পাচ্ছেন যে কম্পাইলারগুলি পিওভ থেকে, এটি কোনও সি ফাইল সংকলন করার সাথে সাথে একটি শ্রেণিবিন্যাস রয়েছে;

বাহ্যিক -> অভ্যন্তরীণ -> সি কোড

এটি সঠিক অর্ডারিং, যেহেতু বাহ্যিক এটি তৃতীয় পক্ষের লাইব্রেরিটি ব্যবহার করা দরকার। যা অভ্যন্তরীণ তা সি কোডটি সংকলন করা দরকার।


4

যদি একটি #includesশিরোলেখ ফাইল শিরোনাম বি এবং সি ফাইল করে, তবে প্রতিটি উত্স ফাইল যা #includesএ এবং বি এবং সি পাবে #included। প্রাক-প্রসেসর আক্ষরিকভাবে কেবল পাঠ্য প্রতিস্থাপন সম্পাদন করে: যে কোনও জায়গায় এটি এমন পাঠ্য পাওয়া যায় যা বলে যে #include <foo.h>এটি foo.hফাইলের পাঠ্য দ্বারা এটি প্রতিস্থাপন করে ।

আপনার #includesশিরোনাম বা উত্স ফাইলগুলি রাখা উচিত কিনা সে সম্পর্কে বিভিন্ন মতামত রয়েছে । ব্যক্তিগতভাবে, আমি #includesডিফল্টরূপে সমস্ত উত্স ফাইলে রাখতে পছন্দ করি তবে যে কোনও শিরোনাম ফাইল যা অন্য প্রাক-প্রয়োজনীয় শিরোনাম ব্যতীত সংকলন করতে পারে না #includeসেই শিরোনামগুলি নিজেরাই।

এবং প্রতিটি শিরোলেখ ফাইলটিতে এটি একাধিকবার অন্তর্ভুক্ত করা রোধ করতে একটি অন্তর্ভুক্ত রক্ষক থাকা উচিত।


4

কিছু পরিবেশে, সংকলনটি দ্রুততম হবে যদি কারওটিতে কেবলমাত্র একটির শিরোনামযুক্ত ফাইল অন্তর্ভুক্ত থাকে। অন্যান্য পরিবেশে, সংকলনটি অনুকূলিত করা হবে যদি সমস্ত উত্স ফাইলগুলি একই প্রাথমিক স্তরের শিরোনাম ব্যবহার করতে পারে (কিছু ফাইলের সাধারণ উপসেটের বাইরে অতিরিক্ত শিরোনাম থাকতে পারে)। আদর্শভাবে, শিরোনামগুলি এমনভাবে তৈরি করা উচিত যাতে একাধিক # অন্তর্ভুক্ত ক্রিয়াকলাপগুলির কোনও প্রভাব থাকবে না। ফাইল-টু-অন্তর্ভুক্ত থাকা অন্তর্ভুক্ত-প্রহরীটির জন্য চেক সহ # বিবৃতি অন্তর্ভুক্ত করা ভাল হতে পারে, যদিও এটি সেই গার্ডের ফর্ম্যাটের উপর নির্ভরতা তৈরি করে। তদ্ব্যতীত, সিস্টেমের ফাইল ক্যাচিং আচরণের উপর নির্ভর করে একটি অপ্রয়োজনীয় # অন্তর্ভুক্ত করুন যার লক্ষ্য সম্পূর্ণরূপে # ifdef'ed হয়ে শেষ হতে পারে না।

আরেকটি বিষয় বিবেচনা করার বিষয় হ'ল যদি কোনও ফাংশন কোনও স্ট্রাক্টে একটি পয়েন্টার নেয়, তবে প্রোটোটাইপ হিসাবে লিখতে পারে

অকার্যকর foo (কাঠামো BAR_s * বার);

সুযোগসুবিধা থাকতে BAR_s এর কোনও সংজ্ঞা ছাড়াই। অপ্রয়োজনীয় এড়ানোর জন্য খুব সহজ পদ্ধতির মধ্যে অন্তর্ভুক্ত রয়েছে।

পিএস - আমার বেশিরভাগ প্রকল্পে, এমন একটি ফাইল থাকবে যা এটি প্রত্যাশা করে যে প্রতিটি মডিউলটি # অন্তর্ভুক্ত করবে, যেখানে পূর্ণসংখ্যার আকার এবং কয়েকটি সাধারণ কাঠামো এবং ইউনিয়নগুলির জন্য টাইপডেফসের মতো জিনিস রয়েছে [উদাহরণস্বরূপ

টাইপডেফ ইউনিয়ন {
  স্বাক্ষরবিহীন দীর্ঘ l;
  স্বাক্ষরযুক্ত স্বল্প lw [2];
  স্বাক্ষরবিহীন চর lb [4];
} U_QUAD;

(হ্যাঁ, আমি জানি যে আমি যদি বড়-এন্ডিয়ান আর্কিটেকচারে চলে যাই তবে আমি সমস্যায় পড়ব, তবে যেহেতু আমার সংকলক ইউনিয়নগুলিতে বেনামে স্ট্রাক্টের অনুমতি দেয় না, ইউনিয়নের বাইটগুলির জন্য নাম চিহ্নিতকারীদের ব্যবহার করে তাদের হিসাবে প্রবেশ করা দরকার theUnion.b.b1 ইত্যাদি যা বিরক্তিকর বলে মনে হচ্ছে।


3

আপনার সমস্ত ফাইল তৈরি করুন যাতে সেগুলি যা অন্তর্ভুক্ত থাকে কেবল তা ব্যবহার করে সেগুলি তৈরি করা যায়। আপনার শিরোনামে অন্তর্ভুক্তের দরকার না থাকলে এটিকে সরিয়ে দিন। একটি বড় প্রকল্পে আপনি যদি এই শৃঙ্খলা বজায় না রাখেন তবে আপনি যখন কোনও শিরোনাম ফাইল থেকে কোনও ফাইল অন্তর্ভুক্ত সরিয়ে ফেলেন তখন কোনও শিরোনাম এমনকি শিরোলেখ দ্বারা নয়, আপনি নিজেকে পুরো বিল্ড ভাঙার জন্য উন্মুক্ত রেখে যান।


1

আপনার উত্স ফাইলটিতে শিরোনাম বিবরণ থাকবে যদি আপনি এটি শিরোনামে রাখেন। তবে কিছু ক্ষেত্রে এগুলি উত্স ফাইলে রাখাই ভাল।

মনে রাখবেন যে আপনি যদি এই শিরোনামটিকে অন্য কোনও উত্সে অন্তর্ভুক্ত করেন তবে তারা শিরোনামের থেকে অন্তর্ভুক্তগুলিও পাবে এবং এটি সর্বদা কাম্য নয়। আপনি কেবল যেখানে স্টাফ ব্যবহৃত হয় তা অন্তর্ভুক্ত করা উচিত।


1

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

#ifndef NAME_OF_HEADER_H
#define NAME_OF_HEADER_H

...definition of header file...

#endif

এটি শিরোনামটিকে একাধিকবার অন্তর্ভুক্ত করা থেকে বিরত রাখে যার ফলে সংকলক ত্রুটি হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.