ঠিক আছে (এমনকি সুপারিশ / ভাল অভ্যাস) এর #include
একটি .c
অন্য ফাইল .c
ফাইল?
ঠিক আছে (এমনকি সুপারিশ / ভাল অভ্যাস) এর #include
একটি .c
অন্য ফাইল .c
ফাইল?
উত্তর:
সঠিকভাবে ব্যবহার করা, এটি একটি দরকারী কৌশল হতে পারে।
বলুন আপনার মোটামুটি ছোট পাবলিক ইন্টারফেস এবং প্রচুর অ-পুনঃব্যবহারযোগ্য প্রয়োগকরণ কোড সহ একটি জটিল, পারফরম্যান্স সমালোচনামূলক সাবসিস্টেম রয়েছে। কোডটি কয়েক হাজার লাইনে চলেছে, একশো বা ততোধিক ব্যক্তিগত ফাংশন এবং ব্যক্তিগত তথ্য বেশ কিছুটা bit আপনি যদি অ-তুচ্ছ এমবেডেড সিস্টেমগুলির সাথে কাজ করেন, তবে আপনি সম্ভবত এই পরিস্থিতিটি প্রায়শই যথেষ্টভাবে মোকাবেলা করেন।
আপনার সমাধান সম্ভবত স্তরযুক্ত, মডিউলার এবং ডিকোপলড হবে এবং এই দিকগুলি উপকারী সিস্টেমের বিভিন্ন অংশগুলিকে বিভিন্ন ফাইলগুলিতে কোডিং করে কার্যকরভাবে উপস্থাপিত এবং শক্তিশালী করা যেতে পারে।
সি সহ, আপনি এটি করে অনেক কিছু হারাতে পারেন। প্রায় সমস্ত সরঞ্জামচেনগুলি একটি একক সংকলনের ইউনিটের জন্য শালীন অপ্টিমাইজেশন সরবরাহ করে তবে বহিরাগত ঘোষিত যে কোনও কিছু সম্পর্কে খুব হতাশাব্যঞ্জক।
আপনি যদি সবকিছুকে একটি সি উত্স মডিউলে রাখেন তবে আপনি পাবেন -
পারফরম্যান্স এবং কোড আকারের উন্নতি - ফাংশন কলগুলি অনেক ক্ষেত্রে ইনলাইন করা হবে। এমনকি ইনলাইন না করেই, সংকলকটির আরও দক্ষ কোড উত্পাদন করার সুযোগ রয়েছে।
লিঙ্ক স্তরের ডেটা এবং ফাংশন লুকানো।
নেমস্পেস দূষণ এবং এর তাত্পর্য প্রতিরোধ এড়ানো - আপনি কম স্বল্প নাম ব্যবহার করতে পারেন।
দ্রুত সংকলন এবং লিঙ্কেজ।
এই ফাইলটি সম্পাদনা করার সময় আপনি একটি অপরিষ্কার জগাখিচুড়ি পেতে পারেন এবং আপনি অন্তর্নিহিত মডুলারিটি হারাবেন। একাধিক ফাইলগুলিতে উত্সকে বিভক্ত করে এবং একক সংকলন ইউনিট তৈরি করার মাধ্যমে এটি কাটিয়ে উঠতে পারে।
এটি সঠিকভাবে পরিচালনা করার জন্য আপনার কিছু কনভেনশন চাপানো দরকার। এগুলি আপনার সরঞ্জামচেনের উপর কিছুটা নির্ভর করে তবে কিছু সাধারণ পয়েন্টার হ'ল -
একটি পৃথক শিরোনাম ফাইলে সর্বজনীন ইন্টারফেস রাখুন - আপনার যাইহোক এটি করা উচিত।
একটি প্রধান .c ফাইল থাকুন যার মধ্যে সমস্ত সহায়ক .c ফাইল অন্তর্ভুক্ত থাকে। এটি পাবলিক ইন্টারফেসের কোডও অন্তর্ভুক্ত করতে পারে।
বেসরকারী শিরোনাম এবং উত্স মডিউলগুলি বাহ্যিক সংকলন ইউনিট অন্তর্ভুক্ত না করে তা নিশ্চিত করতে সংকলক প্রহরী ব্যবহার করুন।
সমস্ত ব্যক্তিগত ডেটা এবং ফাংশন স্থির ঘোষণা করা উচিত।
.C এবং .h ফাইলগুলির মধ্যে ধারণাগত পার্থক্য বজায় রাখুন। এটি বিদ্যমান কনভেনশনগুলিকে কাজে লাগায়। পার্থক্যটি হ'ল আপনার শিরোনামগুলিতে আপনার প্রচুর স্থির ঘোষণা থাকবে have
যদি আপনার টুলচেন কোনও কারণ না চাপিয়ে দেয় তবে ব্যক্তিগত প্রয়োগকারী ফাইলগুলিকে .c এবং .h হিসাবে নাম দিন। আপনি যদি রক্ষীদের অন্তর্ভুক্ত ব্যবহার করেন তবে এগুলি কোনও কোড উত্পন্ন করবে না এবং কোনও নতুন নাম প্রবর্তন করবে না (লিঙ্কেজের সময় আপনি কিছু খালি বিভাগগুলি দিয়ে শেষ করতে পারেন)। বিশাল সুবিধাটি হ'ল অন্যান্য সরঞ্জাম (যেমন আইডিই) এই ফাইলগুলি যথাযথভাবে আচরণ করবে।
ঠিক আছে? হ্যাঁ, এটি সংকলন করা হবে
এটি সুপারিশ করা হয়? কোন - .c ফাইলগুলি .obj ফাইলগুলিতে সংকলন করে, যা সংকলনের পরে একযোগে সংযুক্ত করা হয় (লিঙ্কার দ্বারা) এক্সিকিউটেবল (বা লাইব্রেরি) এর সাথে সংযুক্ত করা হয়, সুতরাং অন্য একটিতে .c ফাইল অন্তর্ভুক্ত করার দরকার নেই। এর পরিবর্তে আপনি যা করতে চান তা হ'ল একটি ফাইল তৈরি করা যা অন্য .c ফাইলে উপলব্ধ ফাংশন / ভেরিয়েবলের তালিকাবদ্ধ করে এবং .h ফাইল অন্তর্ভুক্ত করে
না।
আপনার বিল্ড এনভায়রনমেন্টের উপর নির্ভর করে (আপনি নির্দিষ্ট করবেন না) আপনি দেখতে পাচ্ছেন যে এটি আপনার পছন্দ মতো কাজ করে।
তবে, অনেকগুলি পরিবেশ রয়েছে (উভয় আইডিই এবং অনেকগুলি হস্তচালিত মেকফিলস) যা * .c কম্পাইল করার প্রত্যাশা করে - যদি এটি ঘটে তবে সম্ভবত ডুপ্লিকেট চিহ্নের কারণে আপনি লিঙ্কারের ত্রুটিগুলি শেষ করবেন।
একটি নিয়ম হিসাবে এই অনুশীলন এড়ানো উচিত।
যদি আপনার অবশ্যই উত্স অবশ্যই অন্তর্ভুক্ত থাকে (এবং সাধারণত এটি এড়ানো উচিত) তবে ফাইলটির জন্য একটি পৃথক ফাইল প্রত্যয় ব্যবহার করুন।
আমি ভেবেছিলাম যে আমি এমন পরিস্থিতি ভাগ করব যেখানে আমার দল .c ফাইলগুলি অন্তর্ভুক্ত করার সিদ্ধান্ত নিয়েছে। আমাদের নিবন্ধে মূলত মডিউলগুলি থাকে যা একটি বার্তা সিস্টেমের মাধ্যমে ডিক্লোলড হয়। এই বার্তা হ্যান্ডলারগুলি সর্বজনীন, এবং অনেক স্থানীয় স্থিতিশীল কর্মীদের তাদের কাজ করার জন্য কল করে। আমাদের ইউনিট পরীক্ষার কেসগুলি কভারেজ পাওয়ার চেষ্টা করার সময় এই সমস্যাটি দেখা গেল, কারণ এই ব্যক্তিগত প্রয়োগ কোডটি ব্যবহারের একমাত্র উপায় ছিল পরোক্ষভাবে জনসাধারণের বার্তা ইন্টারফেসের মাধ্যমে। কিছু কর্মী স্ট্যাকের মধ্যে হাঁটু-গভীরভাবে কাজ করে, এটি সঠিক কভারেজ অর্জনের জন্য দুঃস্বপ্নে পরিণত হয়েছিল।
.C ফাইলগুলি অন্তর্ভুক্ত করে আমাদের মেশিনে কগ পৌঁছানোর একটি উপায় দিয়েছিল যা আমরা পরীক্ষায় আগ্রহী।
আপনি একটি আউটপুটে দুটি সি ফাইল লিঙ্ক করতে লিনাক্সে জিসিসি সংকলক ব্যবহার করতে পারেন। ধরুন আপনার কাছে দুটি সি ফাইল রয়েছে একটি হ'ল 'মেইন.সি' এবং অন্যটি 'সাপোর্ট.সি'। সুতরাং এই দুটি লিঙ্ক কমান্ড হয়
gcc main.c support.c -o main.out
এর মাধ্যমে দুটি ফাইলই একক আউটপুট মেইন-এর সাথে সংযুক্ত হবে আউটপুট চালানোর জন্য কমান্ডটি হবে
./main.out
যদি আপনি মেইন.সি. তে ফাংশন ব্যবহার করছেন যা সাপোর্ট.সি. ফাইলটিতে ঘোষিত হয় তবে আপনার বাহ্যিক স্টোরেজ ক্লাসটি ব্যবহার করে এটি প্রধানতে ঘোষণা করা উচিত।
আপনি অন্যান্য উত্স ফাইলে সঠিকভাবে .C বা .CPP ফাইলগুলি অন্তর্ভুক্ত করতে পারেন। আপনার আইডিই'র উপর নির্ভর করে আপনি সাধারণত যে উত্স ফাইলগুলি অন্তর্ভুক্ত করতে চান তার বৈশিষ্ট্যগুলি দেখে সাধারণত এটিতে ডান ক্লিক করে এবং বৈশিষ্ট্যগুলি ক্লিক করে এবং বিল্ড থেকে চেক / চেক সংকলন / লিংক / বর্জন বা যে কোনও বিকল্প থেকে রোধ করতে পারেন usually হতে পারে. অথবা আপনি নিজেই এই প্রকল্পটিতে ফাইলটি অন্তর্ভুক্ত করতে পারবেন না, সুতরাং IDE এটি উপস্থিত রয়েছে তা জানতে পারে না এবং এটি সংকলনের চেষ্টা করবে না। এবং মেকফাইলগুলির সাহায্যে আপনি কেবল ফাইলটি সংকলন এবং সংযোগের জন্য রাখবেন না।
সম্পাদনা: দুঃখিত আমি অন্য উত্তরের জবাবের পরিবর্তে এটিকে একটি উত্তর দিয়েছি :(
সি ভাষা এই ধরণের # অন্তর্ভুক্ত করতে নিষেধ করে না, তবে ফলাফল অনুবাদ ইউনিটটি এখনও বৈধ সি হতে হবে has
আপনি কি প্রোগ্রাম ব্যবহার করতে পারবেন তা আমি জানি না। Prj ফাইলটি। আপনি যদি "মেক" বা ভিজ্যুয়াল স্টুডিও বা অন্য যে কোনও কিছু ব্যবহার করে থাকেন তবে কেবল নিশ্চিত হয়ে নিন যে আপনি নিজের ফাইলগুলি তালিকা স্বতন্ত্রভাবে সংকলন করতে পারবেন না সেগুলি সংকলনের জন্য সেট করেছেন।
অন্য ফাইলটিতে সি ফাইল অন্তর্ভুক্ত করা আইনী, তবে করণীয় যুক্তিযুক্ত নয়, যদি না আপনি সঠিকভাবে জানেন যে আপনি কেন এটি করছেন এবং আপনি কী অর্জন করার চেষ্টা করছেন।
আমি প্রায় নিশ্চিত যে আপনি যদি এখানে পোস্ট করেন তবে আপনার প্রশ্নের পিছনে সম্প্রদায় আপনাকে লক্ষ্য অর্জনের জন্য আরও একটি উপযুক্ত উপায় খুঁজে পাবে (অনুগ্রহ করে "প্রায়" নোট করুন, কারণ এটি প্রাসঙ্গিকভাবে দেওয়া সমাধানই সম্ভব )।
উপায় দ্বারা আমি প্রশ্নের দ্বিতীয় অংশ মিস করেছি। যদি সি ফাইলটিকে অন্য কোনও ফাইলের সাথে অন্তর্ভুক্ত করা হয় এবং একই সময়ে প্রকল্পের সাথে অন্তর্ভুক্ত করা হয় তবে আপনি সম্ভবত ডুপ্লিকেট প্রতীক সমস্যার সাথে শেষ করবেন কেন অবজেক্টগুলিকে সংযুক্ত করা হবে, অর্থাৎ একই ফাংশনটি দু'বার সংজ্ঞায়িত হবে (যদি না তারা সমস্ত স্থির থাকে)।