আমি মনে করি আপনি যে সীমাবদ্ধতা বিবেচনা করেছেন তা শব্দার্থবিজ্ঞানের সাথে সম্পর্কিত নয় (যদি একই ফাইলটিতে সূচনা সংজ্ঞায়িত করা হত তবে কেন কিছু পরিবর্তন করা উচিত?) বরং সি ++ সংকলনের মডেল যা পশ্চাদপদ সামঞ্জস্যের কারণে সহজেই পরিবর্তন করা যায় না কারণ এটি হবে হয় খুব জটিল হয়ে উঠুন (একই সাথে একটি নতুন সংকলন মডেল এবং বিদ্যমানটিকে সমর্থন করে) বা বিদ্যমান কোডটি সংকলন করতে দেবে না (একটি নতুন সংকলন মডেল প্রবর্তন করে এবং বিদ্যমানটিকে বাদ দিয়ে)।
সি ++ সংকলন মডেলটি সি এর থেকে উদ্ভূত হয়, যেখানে আপনি (শিরোলেখ) ফাইলগুলি অন্তর্ভুক্ত করে উত্স ফাইলে ঘোষণাগুলি আমদানি করেন। এইভাবে, সংকলক হ'ল একটি বড় উত্স ফাইল দেখেছে, এতে অন্তর্ভুক্ত সমস্ত ফাইল রয়েছে এবং সেই ফাইলগুলি থেকে অন্তর্ভুক্ত সমস্ত ফাইল পুনরাবৃত্তভাবে। এর আইএমওর একটি বড় সুবিধা রয়েছে, যা এটি সংকলকটি কার্যকর করা সহজ করে তোলে। অবশ্যই, আপনি অন্তর্ভুক্ত ফাইলগুলিতে যে কোনও কিছু লিখতে পারেন, যেমন ঘোষণা এবং সংজ্ঞা উভয়ই। .C বা .cpp ফাইলগুলিতে শিরোনাম ফাইল এবং সংজ্ঞা সংজ্ঞায়িত করা কেবল একটি ভাল অনুশীলন।
অন্যদিকে, একটি সংকলন মডেল থাকা সম্ভব যেখানে কম্পাইলার খুব ভালভাবেই জানে যে যদি এটি একটি গ্লোবাল প্রতীকের ঘোষণাকে আমদানি করে যা অন্য মডিউলে সংজ্ঞায়িত হয় , বা যদি এটি প্রদত্ত কোনও বৈশ্বিক প্রতীকের সংজ্ঞা সংকলন করে থাকে বর্তমান মডিউল । কেবলমাত্র পরবর্তী ক্ষেত্রে সংকলককে অবশ্যই বর্তমান অবজেক্ট ফাইলে এই চিহ্নটি (যেমন একটি ভেরিয়েবল) রাখতে হবে।
উদাহরণস্বরূপ, জিএনইউ পাসকালে আপনি a
কোনও ফাইলটিতে একটি ইউনিট লিখতে পারেন a.pas
:
unit a;
interface
var MyStaticVariable: Integer;
implementation
begin
MyStaticVariable := 0
end.
যেখানে একই উত্স ফাইলে বিশ্বব্যাপী ভেরিয়েবল ঘোষিত হয় এবং প্রারম্ভিক হয়।
তারপরে আপনার বিভিন্ন ইউনিট থাকতে পারে যা একটি আমদানি করে এবং বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করে
MyStaticVariable
, যেমন ইউনিট বি ( b.pas
):
unit b;
interface
uses a;
procedure PrintB;
implementation
procedure PrintB;
begin
Inc(MyStaticVariable);
WriteLn(MyStaticVariable)
end;
end.
এবং একটি ইউনিট গ ( c.pas
):
unit c;
interface
uses a;
procedure PrintC;
implementation
procedure PrintC;
begin
Inc(MyStaticVariable);
WriteLn(MyStaticVariable)
end;
end.
অবশেষে আপনি একটি প্রধান প্রোগ্রামে ইউনিট বি এবং সি ব্যবহার করতে পারেন m.pas
:
program M;
uses b, c;
begin
PrintB;
PrintC;
PrintB
end.
আপনি এই ফাইলগুলি আলাদাভাবে সংকলন করতে পারেন:
$ gpc -c a.pas
$ gpc -c b.pas
$ gpc -c c.pas
$ gpc -c m.pas
এবং তারপরে একটি নির্বাহযোগ্য উত্পাদন করুন:
$ gpc -o m m.o a.o b.o c.o
এবং এটি চালান:
$ ./m
1
2
3
এখানে কৌশলটি হ'ল সংকলক যখন কোনও প্রোগ্রাম মডিউলে কোনও ব্যবহারের নির্দেশ দেখেন (যেমন, বি.পিএস-এ একটি ব্যবহার করে), এটি সংশ্লিষ্ট। পাস্স ফাইলটি অন্তর্ভুক্ত করে না, তবে একটি .gpi ফাইল সন্ধান করে, যেমন একটি প্রাক-সংকলিত জন্য ইন্টারফেস ফাইল ( ডকুমেন্টেশন দেখুন )। এই .gpi
ফাইলগুলি .o
প্রতিটি মডিউল সংকলিত হওয়ার সাথে সাথে ফাইলগুলি সংকলক দ্বারা উত্পাদিত হয় । সুতরাং গ্লোবাল সিম্বলটি MyStaticVariable
কেবলমাত্র একবার বস্তু ফাইলে সংজ্ঞায়িত করা হয় a.o
।
জাভা একইভাবে কাজ করে: যখন সংকলক একটি ক্লাস এ ক্লাস বিতে আমদানি করে তখন এটি A এর জন্য শ্রেণি ফাইলটি দেখায় এবং ফাইলটির প্রয়োজন হয় না A.java
। সুতরাং ক্লাস এ এর সমস্ত সংজ্ঞা এবং সূচনা একটি উত্স ফাইলে রাখা যেতে পারে in
সি ++ এ ফিরে যান, কেন সি ++ এ স্থিতিশীল ডেটা সদস্যদের পৃথক ফাইলে সংজ্ঞায়িত করতে হবে তার কারণ সংযোগকারী দ্বারা ব্যবহৃত লিঙ্কার বা অন্যান্য সরঞ্জামগুলির দ্বারা আরোপিত সীমাবদ্ধতার চেয়ে সি ++ সংকলন মডেলের সাথে বেশি সম্পর্কিত। সি ++ তে কিছু প্রতীক আমদানির অর্থ বর্তমানের সংকলন ইউনিটের অংশ হিসাবে তাদের ঘোষণাটি তৈরি করা। টেমপ্লেটগুলি সংকলিত করার পদ্ধতিতে এটি অন্যান্য বিষয়গুলির মধ্যেও খুব গুরুত্বপূর্ণ। তবে এর দ্বারা বোঝা যায় যে আপনি কোনও অন্তর্ভুক্ত ফাইলটিতে কোনও বৈশ্বিক প্রতীক (ফাংশন, ভেরিয়েবল, পদ্ধতি, স্ট্যাটিক ডেটা সদস্য) সংজ্ঞায়িত করতে পারবেন না / না করা উচিত, অন্যথায় এই চিহ্নগুলি সংকলিত অবজেক্ট ফাইলগুলিতে গুণিত-সংজ্ঞায়িত করা যেতে পারে।