বহু বছর পরে, আমি এই প্রশ্নটি আবিষ্কার করি। প্রতিটি উত্তর এবং মন্তব্য পড়ার পরে, আমি ভেবেছিলাম যে আমি কয়েকটি বিশদ স্পষ্ট করতে পারব ... গুগল অনুসন্ধানের মাধ্যমে যারা এখানে আসে তাদের পক্ষে এটি কার্যকর হতে পারে।
প্রশ্নটি বিশেষত "বহিরাগত" ফাংশনগুলি ব্যবহার সম্পর্কে, সুতরাং আমি গ্লোবাল ভেরিয়েবলগুলির সাথে "বহিরাগত" ব্যবহার উপেক্ষা করব।
আসুন 3 ফাংশন প্রোটোটাইপগুলি সংজ্ঞায়িত করি:
//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
নীচের হিসাবে প্রধান উত্স কোড দ্বারা শিরোনাম ফাইলটি ব্যবহার করা যেতে পারে:
//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"
void main(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
সংকলন এবং লিঙ্ক করার জন্য, আমাদের একই উত্স কোড ফাইলটিতে "ফাংশন 3" সংজ্ঞায়িত করতে হবে যেখানে আমরা সেই ফাংশনটি ডাকি। অন্য দুটি ফাংশন বিভিন্ন উত্স কোড " .C" এ সংজ্ঞায়িত করা যেতে পারে বা এগুলি যে কোনও বাইনারি ফাইল ( .OBJ, * .LIB, * .DLL) এ থাকতে পারে, যার জন্য আমাদের কাছে সোর্স কোড নাও থাকতে পারে।
আসুন "মাই_প্রজেক্ট.এইচ" আবার একটি পৃথক "*। সি" ফাইলে পার্থক্যটি আরও ভালভাবে বোঝার জন্য শিরোনামটি অন্তর্ভুক্ত করা যাক। একই প্রকল্পে, আমরা নিম্নলিখিত ফাইলটি যুক্ত করব:
//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি লক্ষ করুন:
যখন একটি ফাংশন একটি শিরোনাম ফাইলটিতে "স্থিতিশীল" হিসাবে সংজ্ঞায়িত করা হয়, সংকলক / লিংককারীকে অবশ্যই প্রতিটি মডিউলে সেই নামটি সহ কোনও ফাংশনের একটি উদাহরণ সন্ধান করতে হবে যা ফাইল অন্তর্ভুক্ত করে uses
সি লাইব্রেরির অংশ এমন একটি ফাংশন কেবলমাত্র সেই মডিউলে "স্ট্যাটিক" দিয়ে একটি প্রোটোটাইপ পুনরায় সংজ্ঞায়িত করে কেবল একটি মডিউলে প্রতিস্থাপন করা যেতে পারে। উদাহরণস্বরূপ, মেমরি ফাঁস সনাক্তকরণ বৈশিষ্ট্য যুক্ত করতে কোনও কলকে "malloc" এবং "ফ্রি" প্রতিস্থাপন করুন।
নির্দিষ্টকরণকারী "বাহ্যিক" কার্যকারণের জন্য সত্যই প্রয়োজন হয় না। "স্থিতিশীল" খুঁজে পাওয়া যায় না, একটি ফাংশন সর্বদা "বাহ্যিক" হিসাবে ধরে নেওয়া হয়।
তবে ভেরিয়েবলের জন্য "বাহ্যিক" ডিফল্ট নয়। সাধারণত, যে কোনও শিরোনাম ফাইল যা ভেরিয়েবলকে অনেকগুলি মডিউল জুড়ে দৃশ্যমান হতে সংজ্ঞায়িত করে তার "বাহ্যিক" ব্যবহার করা দরকার। একমাত্র ব্যতিক্রম হবে যদি একটি এবং কেবলমাত্র একটি মডিউল থেকে কোনও শিরোনাম ফাইল অন্তর্ভুক্ত করার নিশ্চয়তা দেওয়া হয়।
অনেক প্রজেক্ট ম্যানেজারের তখন প্রয়োজন হয় যে এই জাতীয় চলকটি মডিউলটির শুরুতে স্থাপন করা হবে, কোনও শিরোলেখের ফাইলের মধ্যে নয়। কিছু বড় প্রকল্প, যেমন ভিডিও গেম এমুলেটর "ম্যাম" এমনকি এমন পরিবর্তনশীল ব্যবহার করে কেবল প্রথম ফাংশনের উপরে উপস্থিত হওয়া প্রয়োজন।