প্রথমত, আপনার প্রথম তদন্তটি সম্বোধন করার জন্য:
আপনি যখন এটি .h ফাইলে দেখেন :
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
এটি হিডার ফাইলটিকে একাধিকবার অন্তর্ভুক্ত করা থেকে বিরত রাখার একটি প্রাকপ্রসেসর কৌশল, যা বিভিন্ন কারণে সমস্যাযুক্ত হতে পারে। আপনার প্রকল্পের সংকলনের সময়, প্রতিটি .cpp ফাইল (সাধারণত) সংকলিত হয়। সহজ কথায়, এর অর্থ এই যে সংকলকটি আপনার .cpp ফাইল নেবে , এর #includedদ্বারা যে কোনও ফাইল খুলবে , সেগুলি সমস্তকে একটি বৃহত পাঠ্য ফাইলে সংযুক্ত করবে এবং তারপরে সিনট্যাক্স বিশ্লেষণ করবে এবং শেষ পর্যন্ত এটি এটিকে কিছু মধ্যবর্তী কোডে রূপান্তরিত করবে, অপ্টিমাইজ করবে / অন্য সম্পাদন করবে কাজগুলি, এবং শেষ পর্যন্ত লক্ষ্য আর্কিটেকচারের জন্য সমাবেশ আউটপুট উত্পন্ন করে। এই কারণে যদি কোনও ফাইল #includedএক .cpp এর অধীনে একাধিকবার হয়ফাইল, সংকলক দুটিবার এর ফাইলের বিষয়বস্তু সংযোজন করবে, সুতরাং সেই ফাইলের মধ্যে যদি সংজ্ঞা থাকে তবে আপনি একটি ভেরিয়েবলকে নতুন করে সংজ্ঞায়িত করে একটি সংকলক ত্রুটি পাবেন। সংকলন প্রক্রিয়ার প্রিপ্রসেসর ধাপ দ্বারা ফাইলটি প্রক্রিয়া করা হয়, প্রথমবার যখন এর বিষয়বস্তু প্রথম দুটি লাইনে পৌঁছায় FILE_Hতখন প্রিপ্রোসেসরের জন্য সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করবে । যদি তা না হয় তবে FILE_Hএটি কোডটি #endifনির্দেশ এবং নির্দেশকের মধ্যে সংজ্ঞায়িত করে প্রক্রিয়া চালিয়ে যাবে । পরের বার যখন ফাইলের বিষয়বস্তু প্রিপ্রোসেসর দ্বারা দেখা যাবে, তার বিরুদ্ধে চেকটি FILE_Hমিথ্যা হবে, সুতরাং এটি তাত্ক্ষণিকভাবে স্ক্যান করে #endifএটির পরে চালিয়ে যাবে। এটি পুনরায় সংজ্ঞা ত্রুটিগুলি প্রতিরোধ করে।
এবং আপনার দ্বিতীয় উদ্বেগের সমাধান করতে:
সাধারণ অনুশীলন হিসাবে সি ++ প্রোগ্রামিংয়ে আমরা বিকাশকে দুটি ফাইলের মধ্যে পৃথক করি। এক একটি এক্সটেনশন সাথে আছেন জ এবং আমরা এই একটি কল "হেডারের ফাইল।" এগুলি সাধারণত ফাংশন, ক্লাস, স্ট্রাক্ট, গ্লোবাল ভেরিয়েবল, টাইপডিফস, প্রিপ্রোসেসিং ম্যাক্রোস এবং সংজ্ঞা ইত্যাদির একটি ঘোষণা প্রদান করে মূলত, তারা আপনাকে কেবল আপনার কোড সম্পর্কে তথ্য সরবরাহ করে। তারপরে আমাদের কাছে .cpp এক্সটেনশন রয়েছে যা আমরা একটি "কোড ফাইল" বলি। এটি সেই ফাংশনগুলির জন্য সংজ্ঞা প্রদান করবে, শ্রেণীর সদস্যগণ, কোনও স্ট্রাক্ট সদস্যের যে সংজ্ঞা, গ্লোবাল ভেরিয়েবল ইত্যাদির প্রয়োজন হয়। সুতরাং .h ফাইল কোড ঘোষণা করে এবং .cpp ফাইল সেই ঘোষণার প্রয়োগ করে। এই কারণে, আমরা সাধারণত সংকলনের সময় প্রতিটি .cpp সংকলন করিএকটি বস্তু মধ্যে ফাইল এবং তারপর যারা বস্তুর লিঙ্ক (কারণ আপনার প্রায় না দেখতে এক .cpp ফাইল অন্য অন্তর্ভুক্ত .cpp ফাইল)।
এই বাহ্যিকগুলি কীভাবে সমাধান করা হয় তা লিঙ্কারের জন্য কাজ। আপনার কম্পাইলার প্রক্রিয়া যখন main.cpp , এটা ঘোষণা কোড পায় class.cpp অন্তর্ভুক্ত করে class.h । কেবলমাত্র এই ফাংশনগুলি বা ভেরিয়েবলগুলি দেখতে কেমন তা জানতে হবে (এটি কোনও ঘোষণা আপনাকে দেয়)। সুতরাং এটি আপনার মেইন.পি.পি ফাইলটিকে কিছু বস্তুর ফাইলের মধ্যে সংকলন করে (এটিকে মেইন.ওবিজে কল করুন )। একইভাবে, Class.cpp একটি class.obj তে সংকলিত হয়ফাইল। চূড়ান্ত নির্বাহযোগ্য উত্পাদন করতে, একটি লিঙ্কার সেই দুটি অবজেক্ট ফাইল একসাথে লিঙ্ক করতে অনুরোধ করা হয়। যে কোনও অমীমাংসিত বহিরাগত ভেরিয়েবল বা ফাংশনগুলির জন্য, সংকলকটি একটি স্টাব স্থাপন করবে যেখানে অ্যাক্সেস ঘটে। লিঙ্কারটি তখন এই স্টাবটি নেবে এবং অন্য তালিকাভুক্ত অবজেক্ট ফাইলে কোড বা ভেরিয়েবলের সন্ধান করবে এবং যদি এটি খুঁজে পাওয়া যায় তবে এটি দুটি অবজেক্ট ফাইল থেকে কোডটিকে একটি আউটপুট ফাইলে সংযুক্ত করে এবং স্টাবটিকে ফাংশনের চূড়ান্ত অবস্থানের সাথে প্রতিস্থাপন করে বা পরিবর্তনশীল। এই ভাবে, main.cpp আপনার কোডে ফাংশন এবং ব্যবহারের ভেরিয়েবল কল করতে পারেন class.cpp যদি এবং কেবল যদি তারা ঘোষণা করা class.h ।
আশা করি এটা উপকারে এসেছিল।