ফরোয়ার্ড ঘোষণা বনাম অন্তর্ভুক্ত


18

Reduce the number of #include files in header files. It will reduce build times. Instead, put include files in source code files and use forward declarations in header files.

আমি এখানে এটি পড়া। http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CodingStyle.html

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

প্রশ্ন: শিরোনামে শ্রেণি (শ্রেণি এ) যদি নির্দিষ্ট শ্রেণির (শ্রেণি বি) এর প্রকৃত সংজ্ঞা ব্যবহার না করে, তবে কীভাবে এগিয়ে ঘোষণাগুলি সংকলনের সময় হ্রাস করতে সহায়তা করে?

উত্তর:


12

ক্লায়ার এ ক্লাস বি ব্যবহার করে কিনা তা সংকলকটি বিবেচনা করে না এটি কেবল এটি জানে যে যখন ক্লাস এ সংকলিত হয় এবং এর ক্লাস বি এর কোনও পূর্ব ঘোষণা (সামনের ঘোষণা বা অন্যথায়) থাকে না, তখন এটি আতঙ্কিত হয় এবং এটিকে ত্রুটি হিসাবে চিহ্নিত করে।

এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল সংকলকটি জানে যে আপনার বিড়াল আপনার কীবোর্ডে হাঁটার পরে এবং কিছু এলোমেলো অক্ষর তৈরি করেছে যা ক্লাস হিসাবে ব্যাখ্যা করা যেতে পারে বা নাও হতে পারে after

যখন এটি অন্তর্ভুক্ত দেখায়, এর মধ্যে থাকা যে কোনও তথ্য ব্যবহার করতে সক্ষম হতে, অবশ্যই এটি ফাইলটি খুলতে হবে এবং পার্স করতে হবে (এটি আসলে করার দরকার কিনা তা নির্বিশেষে)। যদি সেই ফাইলটিতে অন্য ফাইলগুলি অন্তর্ভুক্ত থাকে তবে সেগুলি অবশ্যই খোলার এবং পার্স করা উচিত etc. ইত্যাদি If যদি এটি এড়ানো যায় তবে সাধারণত তার পরিবর্তে ফরওয়ার্ড ডিক্লেয়ারেশন ব্যবহার করা ভাল idea

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


ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ. তারপর ok উদাহরণ হিসাবে আপনি কি মনে করেন তিন হেডার ফাইল আছে vehicle.h, bus.h, toybus.hvehicle.hদ্বারা অন্তর্ভুক্ত bus.hএবং দ্বারা bus.hঅন্তর্ভুক্ত toybus.h। তাই যদি আমি কিছু পরিবর্তন করি bus.h। সংকলকটি vehicle.hআবার কি খোলে এবং বিশ্লেষণ করে ? এটি আবার সংকলন করে?
নয়না আদাসুরিয়া

1
@ নয়নাআদাসুরিয়া হ্যাঁ, এটি প্রতিবার অন্তর্ভুক্ত এবং বিশ্লেষণ করা হয়, এ কারণেই আপনি এই জাতীয় ফাইলগুলিকে একাধিকবার অন্তর্ভুক্ত করা থেকে বাঁচাতে (বা কমপক্ষে ifndef ক্ষেত্রে একাধিকবার ব্যবহার করা যেতে পারে) যাতে হেডার ফাইলগুলিতে ঘোষণাগুলি দেখতে #pragma onceবা #ifndef __VEHICLE_H_টাইপ করেন।
নীল

4

কারণ তখন A.hpp এর বিহপকে # অন্তর্ভুক্ত করার দরকার নেই

সুতরাং এএইচপি হয়ে যায়

class B;//or however forward decl works for classes

class A
{
    B* bInstance_;
//...
}

সুতরাং যখন এএইচপি অন্তর্ভুক্ত করা হয় তখন বিএইচপি অন্তর্ভুক্ত অন্তর্ভুক্ত নয় এবং সমস্ত ফাইল যা কেবল এএইচপি উপর নির্ভর করে প্রতিটি বারের জন্য পুনরায় সংযুক্ত করার প্রয়োজন হয় না বি এইচ পি এইচ পি পরিবর্তনগুলি rec


তবে উত্স ফাইলে (A.cpp) আসল শিরোনাম ফাইল (ভ) অন্তর্ভুক্ত করা দরকার। সুতরাং প্রতিবার এটি সংকলন করা প্রয়োজন। অবশেষে উভয় উপায়ে ভি পরিবর্তনগুলির পুনরায় সংশোধন করা দরকার। অন্যরকম?
নয়না আদাসুরিয়া

@ নয়নাআদাসুরিয়া না কারণ এ কেবল বি-তে পয়েন্টার ব্যবহার করে এবং বি-তে পরিবর্তন করা এএইচপি (বা এটিতে যুক্ত ফাইলগুলি) প্রভাব ফেলবে না
র‌্যাচেট ফ্রিক

@ নয়নাআদাসুরিয়া: হ্যাঁ, এ.সি.পি.পি. কে পুনরায় কম্পাইল করতে হবে (যদি এটি এ এর ​​পদ্ধতিগুলির অভ্যন্তরের অভ্যন্তরের বি সংজ্ঞাটি ব্যবহার করে তবে এটি সাধারণত হয়), তবে সিসিপিপি, যা এ ব্যবহার করে তবে সরাসরি বি নয়, তা করবে না will
জান হুডেক

3

মনে রাখবেন, সি / সি ++ প্রিপ্রসেসর একটি পৃথক, নিখুঁত পাঠ্য, প্রক্রিয়াকরণ পদক্ষেপ। #includeঅন্তর্ভুক্ত শিরোনামের বিষয়বস্তুতে নির্দেশ টানাপড়েনে কম্পাইলার এটা বিশ্লেষণ করতে হয়েছে। তদুপরি, প্রত্যেকটির সংকলন .cppসম্পূর্ণ পৃথক, সুতরাং B.hসংকলন করার সময় কেবলমাত্র সংকলকটি পার্স করা হয়েছে B.cppতা সংকলনের সময় যখন আবার প্রয়োজন হয় তখন এটি কমপক্ষে সহায়তা করে না A.cpp। এবং আবার সংকলনের সময় C.cpp। এবং D.cpp। ইত্যাদি। এর মধ্যে অন্তর্ভুক্ত থাকা কোনও ফাইল পরিবর্তন হলে সেই ফাইলগুলির প্রত্যেকটিই পুনরায় সংযুক্ত করতে হবে।

তাই বলে বর্গ Aব্যবহারসমূহ বর্গ Bএবং ক্লাস Cএবং Dব্যবহার বর্গ Aকিন্তু নিপূণভাবে প্রয়োজন হবে না B। ক্লাসটি যদি Aকেবলমাত্র দু'বার সংকলিত Bহওয়ার চেয়ে সামনের ফরওয়ার্ড-ডিক্লেয়ারেশন দিয়ে ঘোষণা B.hকরা যায়: সংকলন করার সময় B.cppএবং A.cpp(কারণ Bএখনও Aএর পদ্ধতিগুলির অভ্যন্তরে প্রয়োজন )।

কিন্তু যখন A.hঅন্তর্ভুক্ত B.h, এটিকে কম্পাইল করা হয় চার বার-যখন কম্পাইল B.cpp, A.cpp, C.cppএবং D.cppপরবর্তী দুই এখন পরোক্ষভাবে অন্তর্ভুক্ত হিসাবে B.hখুব।

এছাড়াও যখন শিরোনাম একাধিকবার অন্তর্ভুক্ত করা হয়, তখনও প্রিপ্রেসেসরটি প্রতিবার এটি পড়তে হয় । গার্ডিংয়ের কারণে এটি এর সামগ্রীতে প্রসেসিং এড়িয়ে যাবে #ifdef, তবে এটি এখনও এটি পড়ে এবং গার্ডের শেষের সন্ধান করা দরকার, যার অর্থ এটি ভিতরে সমস্ত প্রিপ্রসেসর নির্দেশিকা বিশ্লেষণ করতে হবে।

(অন্য উত্তরে উল্লিখিত হিসাবে, পূর্বনির্ধারিত শিরোনামগুলি এটিকে ঘিরে কাজ করার চেষ্টা করা হয়, তবে এগুলি তাদের নিজস্ব কৃমি হতে পারে; মূলত আপনি এগুলি সিস্টেম শিরোনামের জন্য যুক্তিসঙ্গতভাবে ব্যবহার করতে পারেন এবং কেবল যদি আপনি তাদের খুব বেশি ব্যবহার না করেন তবে এর জন্য নয়) আপনার প্রকল্পের শিরোনাম)


+1, শিরোনাম-অন্তর্ভুক্ত কেবলমাত্র গুরুতর সমস্যা হয়ে উঠবে যখন আপনার মোটামুটি বিশাল সংখ্যক ক্লাস রয়েছে, যখন কেবল দুটি এবং এ, বি ক্লাস দুটি নেই তখন অন্য সমস্ত পোস্ট মনে হয় যে এই কেন্দ্রীয় পয়েন্টটি মিস করে।
ডক ব্রাউন

2

একটি সামনের শিরোনাম ফাইলের তুলনায় একটি ফরওয়ার্ড ডিক্লেয়ারেশন পার্স করার পক্ষে আরও দ্রুত এবং এতে আরও বেশি শিরোনাম ফাইল অন্তর্ভুক্ত থাকতে পারে।

এছাড়াও, আপনি ক্লাস বি এর জন্য শিরোনাম ফাইলে কিছু পরিবর্তন করলে, সেই শিরোলেখ সহ সমস্ত কিছু আবার সংকলন করতে হবে। একটা ফরওয়ার্ড ঘোষণা দিয়ে, যে শুধুমাত্র সোর্স ফাইল যেখানে A বাস্তবায়ন বসবাস করছেন হতে পারে। কিন্তু যদি ক এর হেডার আসলে বি এর হেডার অন্তর্ভুক্ত সহ সবকিছু a.hppএছাড়াও recompiled করা হবে, যদিও তা বি কিছু ব্যবহার করে না

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