অন্য একটি সি উত্স ফাইল সহ?


111

ঠিক আছে (এমনকি সুপারিশ / ভাল অভ্যাস) এর #includeএকটি .cঅন্য ফাইল .cফাইল?


4
প্রশ্নটি সম্পাদনা করার জন্য আমি স্বাধীনতা নিয়েছি এবং কিছু কার্যকর ট্যাগও প্রয়োগ করেছি। আমার কিছু ট্যাগ সম্ভবত পক্ষপাত দেখায়, হি।
বিনোদন

উত্তর:


113

সঠিকভাবে ব্যবহার করা, এটি একটি দরকারী কৌশল হতে পারে।

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

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

সি সহ, আপনি এটি করে অনেক কিছু হারাতে পারেন। প্রায় সমস্ত সরঞ্জামচেনগুলি একটি একক সংকলনের ইউনিটের জন্য শালীন অপ্টিমাইজেশন সরবরাহ করে তবে বহিরাগত ঘোষিত যে কোনও কিছু সম্পর্কে খুব হতাশাব্যঞ্জক।

আপনি যদি সবকিছুকে একটি সি উত্স মডিউলে রাখেন তবে আপনি পাবেন -

  • পারফরম্যান্স এবং কোড আকারের উন্নতি - ফাংশন কলগুলি অনেক ক্ষেত্রে ইনলাইন করা হবে। এমনকি ইনলাইন না করেই, সংকলকটির আরও দক্ষ কোড উত্পাদন করার সুযোগ রয়েছে।

  • লিঙ্ক স্তরের ডেটা এবং ফাংশন লুকানো।

  • নেমস্পেস দূষণ এবং এর তাত্পর্য প্রতিরোধ এড়ানো - আপনি কম স্বল্প নাম ব্যবহার করতে পারেন।

  • দ্রুত সংকলন এবং লিঙ্কেজ।

এই ফাইলটি সম্পাদনা করার সময় আপনি একটি অপরিষ্কার জগাখিচুড়ি পেতে পারেন এবং আপনি অন্তর্নিহিত মডুলারিটি হারাবেন। একাধিক ফাইলগুলিতে উত্সকে বিভক্ত করে এবং একক সংকলন ইউনিট তৈরি করার মাধ্যমে এটি কাটিয়ে উঠতে পারে।

এটি সঠিকভাবে পরিচালনা করার জন্য আপনার কিছু কনভেনশন চাপানো দরকার। এগুলি আপনার সরঞ্জামচেনের উপর কিছুটা নির্ভর করে তবে কিছু সাধারণ পয়েন্টার হ'ল -

  • একটি পৃথক শিরোনাম ফাইলে সর্বজনীন ইন্টারফেস রাখুন - আপনার যাইহোক এটি করা উচিত।

  • একটি প্রধান .c ফাইল থাকুন যার মধ্যে সমস্ত সহায়ক .c ফাইল অন্তর্ভুক্ত থাকে। এটি পাবলিক ইন্টারফেসের কোডও অন্তর্ভুক্ত করতে পারে।

  • বেসরকারী শিরোনাম এবং উত্স মডিউলগুলি বাহ্যিক সংকলন ইউনিট অন্তর্ভুক্ত না করে তা নিশ্চিত করতে সংকলক প্রহরী ব্যবহার করুন।

  • সমস্ত ব্যক্তিগত ডেটা এবং ফাংশন স্থির ঘোষণা করা উচিত।

  • .C এবং .h ফাইলগুলির মধ্যে ধারণাগত পার্থক্য বজায় রাখুন। এটি বিদ্যমান কনভেনশনগুলিকে কাজে লাগায়। পার্থক্যটি হ'ল আপনার শিরোনামগুলিতে আপনার প্রচুর স্থির ঘোষণা থাকবে have

  • যদি আপনার টুলচেন কোনও কারণ না চাপিয়ে দেয় তবে ব্যক্তিগত প্রয়োগকারী ফাইলগুলিকে .c এবং .h হিসাবে নাম দিন। আপনি যদি রক্ষীদের অন্তর্ভুক্ত ব্যবহার করেন তবে এগুলি কোনও কোড উত্পন্ন করবে না এবং কোনও নতুন নাম প্রবর্তন করবে না (লিঙ্কেজের সময় আপনি কিছু খালি বিভাগগুলি দিয়ে শেষ করতে পারেন)। বিশাল সুবিধাটি হ'ল অন্যান্য সরঞ্জাম (যেমন আইডিই) এই ফাইলগুলি যথাযথভাবে আচরণ করবে।


1
+1 এটি এখনও বাস্তবতা, যখন আরও ভাল সংকলকরা এই পদ্ধতিটি সময়ের সাথে অচল করে দেবে। লিঙ্ক-টাইম অপ্টিমাইজেশান সহ জিসিসি 4.5 এই পথে এক বড় পদক্ষেপ।
u0b34a0f6ae

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

C51- এর এম্বেডড বিকাশে, বহিরাগত এবং একাধিক সি ফাইল ব্যবহারের কারণে মাথা ব্যথা ব্যতীত কিছুই হয়নি। আমার সময় ফিরে পেতে আমি একটি সি ফাইল রেখে অন্য সকলকে অন্তর্ভুক্ত করছি।
mahesh

রেকর্ডগুলির জন্য: জিসিসি বিভিন্ন অনুবাদ ইউনিট জুড়ে অপ্টিমাইজেশন সমর্থন করে, লিঙ্ক টাইম অপ্টিমাইজেশনে এই এস থ্রেড এবং জিসিসি ম্যানুয়াল বিভাগটি দেখুন ।
টোভনকি

60

ঠিক আছে? হ্যাঁ, এটি সংকলন করা হবে

এটি সুপারিশ করা হয়? কোন - .c ফাইলগুলি .obj ফাইলগুলিতে সংকলন করে, যা সংকলনের পরে একযোগে সংযুক্ত করা হয় (লিঙ্কার দ্বারা) এক্সিকিউটেবল (বা লাইব্রেরি) এর সাথে সংযুক্ত করা হয়, সুতরাং অন্য একটিতে .c ফাইল অন্তর্ভুক্ত করার দরকার নেই। এর পরিবর্তে আপনি যা করতে চান তা হ'ল একটি ফাইল তৈরি করা যা অন্য .c ফাইলে উপলব্ধ ফাংশন / ভেরিয়েবলের তালিকাবদ্ধ করে এবং .h ফাইল অন্তর্ভুক্ত করে


14
এটি লক্ষণীয় যে এটি সংকলন করেও যদি এটি # অন্তর্ভুক্ত .c ফাইলটি সংকলিত হয় এবং দুটি অবজেক্ট ফাইল একসাথে সংযুক্ত থাকে তবে এটি সংযুক্ত নাও করতে পারে - আপনি বহুগুণ সংজ্ঞায়িত চিহ্ন সহ শেষ করতে পারেন।
নিক মায়ার

1
একটি ছোট প্রশ্ন। আমি একটি শিরোনাম ফাইলটি একটি স্ট্রাক্ট + পদ্ধতি ঘোষণা করার সাথে সাথে সম্পর্কিত। সি ফাইলগুলি তাদের সংজ্ঞায়িত করতে চাইছি। যদি সেই পদ্ধতিটি স্ট্রাক্টটিকে প্যারামিটার হিসাবে গ্রহণ করে তবে আমি যেখানে অন্য পদ্ধতি .c ফাইলের মূল পদ্ধতিটি সংজ্ঞায়িত করা হয় সেখানে .c ফাইলটি অন্তর্ভুক্ত করে কীভাবে এড়াব?
স্ট্যান্ডআউট

12

না।

আপনার বিল্ড এনভায়রনমেন্টের উপর নির্ভর করে (আপনি নির্দিষ্ট করবেন না) আপনি দেখতে পাচ্ছেন যে এটি আপনার পছন্দ মতো কাজ করে।

তবে, অনেকগুলি পরিবেশ রয়েছে (উভয় আইডিই এবং অনেকগুলি হস্তচালিত মেকফিলস) যা * .c কম্পাইল করার প্রত্যাশা করে - যদি এটি ঘটে তবে সম্ভবত ডুপ্লিকেট চিহ্নের কারণে আপনি লিঙ্কারের ত্রুটিগুলি শেষ করবেন।

একটি নিয়ম হিসাবে এই অনুশীলন এড়ানো উচিত।

যদি আপনার অবশ্যই উত্স অবশ্যই অন্তর্ভুক্ত থাকে (এবং সাধারণত এটি এড়ানো উচিত) তবে ফাইলটির জন্য একটি পৃথক ফাইল প্রত্যয় ব্যবহার করুন।


9

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

.C ফাইলগুলি অন্তর্ভুক্ত করে আমাদের মেশিনে কগ পৌঁছানোর একটি উপায় দিয়েছিল যা আমরা পরীক্ষায় আগ্রহী।


6

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

gcc main.c support.c -o main.out

এর মাধ্যমে দুটি ফাইলই একক আউটপুট মেইন-এর সাথে সংযুক্ত হবে আউটপুট চালানোর জন্য কমান্ডটি হবে

./main.out

যদি আপনি মেইন.সি. তে ফাংশন ব্যবহার করছেন যা সাপোর্ট.সি. ফাইলটিতে ঘোষিত হয় তবে আপনার বাহ্যিক স্টোরেজ ক্লাসটি ব্যবহার করে এটি প্রধানতে ঘোষণা করা উচিত।


5

ফাইলের প্রসারটি বেশিরভাগ সি সংকলকগুলির পক্ষে আসে না, তাই এটি কাজ করবে।

তবে আপনার মেকফিল বা প্রজেক্ট সেটিংসের উপর নির্ভর করে অন্তর্ভুক্ত সি ফাইলটি পৃথক অবজেক্ট ফাইল তৈরি করতে পারে। লিঙ্ক করার সময় এটি দ্বিগুণ সংজ্ঞায়িত প্রতীক হতে পারে।


3

আপনি অন্যান্য উত্স ফাইলে সঠিকভাবে .C বা .CPP ফাইলগুলি অন্তর্ভুক্ত করতে পারেন। আপনার আইডিই'র উপর নির্ভর করে আপনি সাধারণত যে উত্স ফাইলগুলি অন্তর্ভুক্ত করতে চান তার বৈশিষ্ট্যগুলি দেখে সাধারণত এটিতে ডান ক্লিক করে এবং বৈশিষ্ট্যগুলি ক্লিক করে এবং বিল্ড থেকে চেক / চেক সংকলন / লিংক / বর্জন বা যে কোনও বিকল্প থেকে রোধ করতে পারেন usually হতে পারে. অথবা আপনি নিজেই এই প্রকল্পটিতে ফাইলটি অন্তর্ভুক্ত করতে পারবেন না, সুতরাং IDE এটি উপস্থিত রয়েছে তা জানতে পারে না এবং এটি সংকলনের চেষ্টা করবে না। এবং মেকফাইলগুলির সাহায্যে আপনি কেবল ফাইলটি সংকলন এবং সংযোগের জন্য রাখবেন না।

সম্পাদনা: দুঃখিত আমি অন্য উত্তরের জবাবের পরিবর্তে এটিকে একটি উত্তর দিয়েছি :(


1

সি ভাষা এই ধরণের # অন্তর্ভুক্ত করতে নিষেধ করে না, তবে ফলাফল অনুবাদ ইউনিটটি এখনও বৈধ সি হতে হবে has

আপনি কি প্রোগ্রাম ব্যবহার করতে পারবেন তা আমি জানি না। Prj ফাইলটি। আপনি যদি "মেক" বা ভিজ্যুয়াল স্টুডিও বা অন্য যে কোনও কিছু ব্যবহার করে থাকেন তবে কেবল নিশ্চিত হয়ে নিন যে আপনি নিজের ফাইলগুলি তালিকা স্বতন্ত্রভাবে সংকলন করতে পারবেন না সেগুলি সংকলনের জন্য সেট করেছেন।


0

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

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


-6

আপনার এটির মতো শিরোনাম যুক্ত করা উচিত

#include <another.c>

দ্রষ্টব্য: উভয় ফাইল একই জায়গায় স্থাপন করা উচিত

আমি এটিটিএমএজিএ মাইক্রো কন্ট্রোলারের জন্য কোডভিসন এভিআর-তে ব্যবহার করি এবং সত্যই কাজ করি তবে এটি সাধারণ সি ভাষা ফাইলগুলিতে কাজ করে না

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