নিশ্চিত হওয়া যে শিরোনামগুলি স্পষ্টভাবে সিপিপি ফাইলে অন্তর্ভুক্ত রয়েছে


9

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

এমন কোনও সরঞ্জাম রয়েছে যা এই #includeকোডিং শৈলীর প্রয়োগ করতে পারে ? করা উচিত আমি এই কোডিং শৈলী প্রয়োগ?

যেহেতু প্রিপ্রোসেসর / #includeসংকলকটি এইচপিপি বা সিপিপি থেকে আসছে তা যত্নশীল নয় , তাই আমি যদি এই স্টাইলটি অনুসরণ করতে ভুলে যাই তবে আমি কোনও প্রতিক্রিয়া পাই না get

উত্তর:


7

এটি কোডিং স্ট্যান্ডার্ডের "করণীয়" পরিবর্তে "উচিত" এর মধ্যে একটি। কারণটি হ'ল এটি প্রয়োগের জন্য আপনাকে অনেকগুলি সি ++ পার্সার লিখতে হবে।

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

#include "foo.hh"
int main () {
   return 0;
}

কিছু শিরোনামে অন্যান্য শ্রেণি ব্যবহারের ক্ষেত্রে এই নিয়মের ফলাফল রয়েছে। কখনও কখনও এই অন্যান্য ক্লাস ঘোষণা করে এই পরিণতিগুলি এড়ানো যায়। প্রচুর স্ট্যান্ডার্ড গ্রন্থাগার ক্লাসের মাধ্যমে এটি সম্ভব নয়। কোনও টেম্পলেট ইনস্ট্যান্টেশন যেমন std::stringবা হিসাবে ঘোষণা করার কোনও উপায় নেই std::vector<SomeType>#includeশিরোনামে a এসটিএল শিরোনামগুলি আপনার কাছে থাকতে হবে এমনকি যদি টাইপের একমাত্র ব্যবহার কোনও ফাংশনের যুক্তি হিসাবে থাকে।

আপনি যে ঘটনাক্রমে টানছেন সেগুলি নিয়ে আর একটি সমস্যা Example উদাহরণ: নিম্নলিখিতগুলি বিবেচনা করুন:

ফাইল foo.cc:

#include "foo.hh"
#include "bar.hh"

void Foo::Foo () : bar() { /* body elided */ }

void Foo::do_something (int item) {
   ...
   bar.add_item (item);
   ...
}

এখানে টাইপ barকরা একটি শ্রেণীর Fooডেটা সদস্য Bar। আপনি এখানে সঠিক জিনিসটি করেছেন এবং # বার বার অন্তর্ভুক্ত করেছেন যদিও এটি ক্লাস সংজ্ঞায়িত করে শিরোলেখটিতে অন্তর্ভুক্ত থাকতে হবে Foo। যাইহোক, আপনি দ্বারা ব্যবহৃত কাপড় অন্তর্ভুক্ত না Bar::Bar()এবং Bar::add_item(int)। এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে এই কলগুলির অতিরিক্ত বাহ্যিক রেফারেন্স হতে পারে।

আপনি যদি foo.oকোনও সরঞ্জাম যেমন বিশ্লেষণ করেন তবে nmএটি উপস্থিত হবে যে ফাংশনগুলি foo.ccসমস্ত ধরণের স্টাফকে কল করছে যার জন্য আপনি উপযুক্ত কাজ করেন নি #include। সুতরাং আপনি কি #includeএই ঘটনাগুলি বহিরাগত রেফারেন্সের জন্য নির্দেশাবলী যুক্ত করা উচিত foo.cc? উত্তর একেবারে না। সমস্যাটি হ'ল সরাসরি বলা হয় এমন কর্মগুলির থেকে ঘটনাক্রমে ডাকা ফাংশনগুলির মধ্যে পার্থক্য করা খুব কঠিন।


2

আমি কি এই কোডিং শৈলীটি প্রয়োগ করব?

সম্ভবত না. আমার নিয়মটি হ'ল: শিরোনাম ফাইল অন্তর্ভুক্তি অর্ডার নির্ভর হতে পারে না।

এক্সসি দ্বারা অন্তর্ভুক্ত প্রথম ফাইলটি এক্সএইচ হ'ল সহজ নিয়মের সাহায্যে আপনি এটি বেশ সহজেই যাচাই করতে পারেন


1
আপনি এই সম্পর্কে বিস্তারিত বলতে পারেন? আমি দেখতে পাচ্ছি না যে এটি কীভাবে অর্ডার-স্বাধীনতা যাচাই করবে।
অবধি

1
এটি অর্ডার স্বাধীনতার গ্যারান্টি দেয় না - এটি কেবল #include "x.h"পূর্বের প্রয়োজন ছাড়াই কাজ করে তা নিশ্চিত করে #include। আপনি গালি না দিলে এটি যথেষ্ট ভাল #define
কেভিন ক্লাইন

1
আচ্ছা বুঝলাম. এখনও একটি ভাল ধারণা।
অবধি 21:18

2

আপনার যদি কোনও নিয়ম কার্যকর করার প্রয়োজন হয় তবে নির্দিষ্ট হেডার ফাইলগুলি নিজেরাই দাঁড়াতে হবে আপনি ইতিমধ্যে থাকা সরঞ্জামগুলি ব্যবহার করতে পারেন। একটি বেসিক মেকফিল তৈরি করুন যা প্রতিটি শিরোনাম ফাইল পৃথকভাবে সংকলন করে তবে কোনও বস্তু ফাইল তৈরি করে না। আপনি কোন মোডে (সি বা সি ++ মোড) শিরোনাম ফাইলটি সংকলন করতে পারবেন তা যাচাই করতে সক্ষম হবেন এবং এটি নিজেরাই দাঁড়িয়ে থাকতে পারে তা যাচাই করতে পারবেন। আপনি যুক্তিসঙ্গত অনুমান করতে পারেন যে আউটপুটটিতে কোনও মিথ্যা ধনাত্মক নেই, সমস্ত প্রয়োজনীয় নির্ভরতা ঘোষণা করা হয় এবং আউটপুট সঠিক is

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


1

আমি মনে করি না যে এই জাতীয় কোনও সরঞ্জাম বিদ্যমান, তবে অন্য কোনও উত্তর আমাকে অস্বীকার করলে আমি খুশি হব।

এই জাতীয় একটি সরঞ্জাম লেখার সমস্যাটি এটি খুব সহজেই একটি ভুল ফলাফলের প্রতিবেদন করে, তাই আমি এই জাতীয় সরঞ্জামের নেট সুবিধাটি শূন্যের কাছাকাছি হওয়ার অনুমান করি।

এই জাতীয় সরঞ্জামটি কেবল কার্যকরভাবে কাজ করতে পারে যদি এটি এর প্রতীক টেবিলটিকে কেবল প্রক্রিয়াজাত শিরোলেখের ফাইলগুলিতে পুনরায় সেট করতে পারে তবে আপনি যে সমস্যার সাথে চালিয়ে যাচ্ছেন যে কোনও শিরোনাম গ্রন্থাগারের বহিরাগত এপিআই গঠন করে প্রকৃত ঘোষণাগুলি প্রতিনিধিত্ব করে অভ্যন্তরীণ শিরোনাম
উদাহরণস্বরূপ, <string>জিসিসিতে libc ++ বাস্তবায়ন কোনও ঘোষণা দেয় না, তবে এটিতে অভ্যন্তরীণ শিরোনামগুলির মধ্যে একগুচ্ছ অন্তর্ভুক্ত রয়েছে যা প্রকৃত ঘোষণা দেয়। যদি সরঞ্জামটি তার প্রতীক টেবিলটিকে পুনরায় সেট করে তবে যা সে <string>নিজেই ঘোষণা করেছিল, এটি কিছুই হবে না।
আপনি মধ্যে টুল পার্থক্য থাকতে পারে #include ""এবং #include <>, কিন্তু যদি একটি বহিস্থিত গ্রন্থাগার ব্যবহারের যে আপনার সাহায্য না #include ""API এ অভ্যন্তরীণ শিরোলেখগুলি অন্তর্ভুক্ত করা হবে।


1

এটি #Pragma onceঅর্জন করে না ? আপনি যতবার চান কিছুবার অন্তর্ভুক্ত করতে পারেন, প্রত্যক্ষভাবে বা শৃঙ্খলে অন্তর্ভুক্ত রয়েছে এবং যতক্ষণ না #Pragma onceতাদের প্রত্যেকটির পাশে রয়েছে, শিরোনামটি কেবল একবার অন্তর্ভুক্ত করা হয়েছে।

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


1

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


আপনি কীভাবে ব্যাখ্যা করতে পারেন যে এটি কীভাবে "সংকলনের সময়কে উল্লেখযোগ্যভাবে সংক্ষিপ্ত করবে"?
মাওগ বলছেন মনিকা

1
এটি নিশ্চিত করে যে প্রতিটি সংকলন ইউনিট (সিপিপি ফাইল) সংকলনের সময় ন্যূনতম অন্তর্ভুক্ত ফাইলগুলিতে টান দেয়। অন্যথায়, আপনি যদি এইচ ফাইলগুলিতে অন্তর্ভুক্ত করেন তবে মিথ্যা নির্ভরতা শৃঙ্খলাগুলি দ্রুত তৈরি হয় এবং আপনি প্রতিটি সংকলন সহ সমস্তগুলি অন্তর্ভুক্ত করে শেষ করেন।
Gvozden

অন্তর্ভুক্ত প্রহরীদের সাথে, আমি সম্ভবত "তাত্পর্যপূর্ণ" জিজ্ঞাসা করতে পারি, তবে আমি মনে করি যে ডিস্ক অ্যাক্সেস (inসব ছদ্মবেশী গার্ডগুলি আবিষ্কার করার জন্য) "ধীর" তাই বিন্দুটিকে সিড করবে ,. স্পষ্ট করার জন্য ধন্যবাদ
মাওগ

0

আমি বলব যে এই সম্মেলনের সুবিধা এবং অসুবিধা উভয়ই রয়েছে। একদিকে আপনার .cpp ফাইলটি কী অন্তর্ভুক্ত করছে তা জানতে পেরে দুর্দান্ত। অন্যদিকে, অন্তর্ভুক্তগুলির তালিকা সহজেই একটি হাস্যকর আকারে বাড়তে পারে।

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

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


3
যদি আপনি চলে যান তবে শিরোনামগুলি অন্তর্ভুক্ত রয়েছে, তারপরে অর্ডারটি গুরুত্বপূর্ণ হয়ে উঠবে ... এবং আমি অবশ্যই তা এড়াতে চাই।
এম ডুডলি

1
-1: নির্ভরতার দুঃস্বপ্ন তৈরি করে। এক্স-এর উন্নতকরণের জন্য প্রতিটি .cpp ফাইলে পরিবর্তনের প্রয়োজন হতে পারে যার মধ্যে xh
কেভিন cline

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