উত্তর:
যখন আপনি একটি বাস্তবায়ন ফাইলটি লিখতে ( .cpp
, .cxx
ইত্যাদি) আপনার কম্পাইলার একটি উত্পন্ন অনুবাদ ইউনিট । এটি আপনার প্রয়োগের উত্স ফাইল এবং এতে যে সমস্ত শিরোলেখ রয়েছে #include
।
অভ্যন্তরীণ সংযোগ কেবল একটি অনুবাদ ইউনিটের সুযোগগুলিতে সমস্ত কিছুকে বোঝায় ।
বাহ্যিক সংযোগ এমন কিছু জিনিসকে বোঝায় যা একটি নির্দিষ্ট অনুবাদ ইউনিটের বাইরে রয়েছে। অন্য কথায়, পুরো প্রোগ্রামের মাধ্যমে অ্যাক্সেসযোগ্য , যা সমস্ত অনুবাদ ইউনিট (বা অবজেক্ট ফাইল) এর সমন্বয়।
const
ভেরিয়েবলের নিয়ম (সেইসাথে এর উদ্দেশ্য) সম্পর্কে প্রশ্নটি পুরোপুরি মিস হয়েছে।
যেমন ডুডাওয়াত বলেছিল বাহ্যিক সংযোগের অর্থ প্রতীক (ফাংশন বা গ্লোবাল ভেরিয়েবল) আপনার পুরো প্রোগ্রাম জুড়ে অ্যাক্সেসযোগ্য এবং অভ্যন্তরীণ সংযোগের অর্থ এটি কেবল একটি অনুবাদ ইউনিটে অ্যাক্সেসযোগ্য ।
আপনি ব্যবহার করে প্রতীকের যোগসূত্রটি স্পষ্টভাবে নিয়ন্ত্রণ করতে পারেন extern
static
কীওয়ার্ড এবং কীওয়ার্ড । যদি লিঙ্কেজটি নির্দিষ্ট না করা থাকে তবে ডিফল্ট সংযোগটি extern
অ- const
চিহ্নগুলির জন্য এবং static
(অভ্যন্তরীণ) const
চিহ্নগুলির জন্য ।
// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static
// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static
নোট করুন যে static
অভ্যন্তরীণ সংযোগের জন্য ব্যবহার করার পরিবর্তে বেনামে নাম স্থানগুলি ব্যবহার করা ভালclass
। বেনামে নামস্থানগুলির লিঙ্কেজটি সি ++ 98 এবং সি ++ 11 এর মধ্যে পরিবর্তিত হয়েছে তবে মূল বিষয় হ'ল তারা অন্য অনুবাদ ইউনিট থেকে অ্যাক্সেসযোগ্য।
namespace {
int i; // external linkage but unreachable from other translation units.
class invisible_to_others { };
}
extern
ডিক্লারেশন দিয়ে এটি ধারণ করা ছাড়া অন্য ফাইলগুলিতে বাড়ানো যেতে পারে ।static
। এ জাতীয় ভেরিয়েবলগুলির অভ্যন্তরীণ সংযোগ রয়েছে বলে জানা যায় ।নিম্নলিখিত উদাহরণ বিবেচনা করুন:
void f(int i);
extern const int max = 10;
int n = 0;
int main()
{
int a;
//...
f(a);
//...
f(a);
//...
}
f
ঘোষণা করে । এর সংজ্ঞাটি অবশ্যই এই ফাইলে বা অন্য অনুবাদ ইউনিটে সরবরাহ করতে হবে (নীচে দেওয়া হয়েছে)।f
max
একটি সংখ্যার ধ্রুবক হিসাবে সংজ্ঞায়িত করা হয়। ধ্রুবকগুলির জন্য ডিফল্ট সংযোগটি অভ্যন্তরীণ । এর সংযোগটি কীওয়ার্ডের সাহায্যে বহিরাগতে পরিবর্তিত হয়েছে extern
। তাই এখনmax
অন্যান্য ফাইল অ্যাক্সেস করা যেতে পারে।n
একটি পূর্ণসংখ্যা পরিবর্তনশীল হিসাবে সংজ্ঞায়িত করা হয়। ভেরিয়েবলের জন্য ডিফল্ট লিঙ্কেজটি ফাংশন বডিগুলির বাইরে সংজ্ঞায়িত করা হয়বহিরাগত বাহ্যিক ।#include <iostream>
using namespace std;
extern const int max;
extern int n;
static float z = 0.0;
void f(int i)
{
static int nCall = 0;
int a;
//...
nCall++;
n++;
//...
a = max * z;
//...
cout << "f() called " << nCall << " times." << endl;
}
max
আছে ঘোষণা করা হয় বাহ্যিক সংযোগ । max
(বাহ্যিক সংযোগ সহ) এর জন্য একটি মিলের সংজ্ঞা অবশ্যই কিছু ফাইলে উপস্থিত হবে। (যেমন 1.cpp তে)n
বাহ্যিক সংযোগ আছে বলে ঘোষণা করা হয় ।z
হয় সংজ্ঞায়িত সঙ্গে একটি বিশ্বব্যাপী পরিবর্তনশীল হিসাবে অভ্যন্তরীণ দুটো ঘটনার ।nCall
নির্দিষ্ট nCall
করার সংজ্ঞাটি ফাংশন করার জন্য কলগুলির জুড়ে এর মান ধরে রাখে f()
। ডিফল্ট অটো স্টোরেজ ক্লাসের সাথে স্থানীয় ভেরিয়েবলগুলির বিপরীতে nCall
, প্রোগ্রামের শুরুতে একবার একবার আরম্ভ করা হবে এবং প্রতিটি অনুরোধের জন্য একবার নয়f()
। স্টোরেজ ক্লাস স্পেসিফায়ার static
স্থানীয় ভেরিয়েবলের জীবদ্দশায় প্রভাব ফেলে না এবং এর পরিধিটি নয়।এনবি: কীওয়ার্ডটি static
দ্বৈত ভূমিকা পালন করে। গ্লোবাল ভেরিয়েবলের সংজ্ঞা হিসাবে ব্যবহৃত হয়, এটি নির্দিষ্ট করে অভ্যন্তরীণ লিঙ্কেজ । যখন স্থানীয় ভেরিয়েবলের সংজ্ঞা ব্যবহৃত হয়, এটি নির্দিষ্ট করে যে ভেরিয়েবলের আজীবন কর্মসূচির সময়কাল না হয়ে প্রোগ্রামের সময়কাল হতে চলেছে।
আশা করি এইটি কাজ করবে!
static
অলস একক সূচনা করার অনুমতি দেয় (এটি কার্যকর হতে পারে যদি আপনাকে গ্লোবাল-ইশ অবজেক্টের প্রয়োজন হয় তবে এটি নিয়ন্ত্রণ করতে হবে যখন এটি বিশ্বব্যাপী নির্মাণ আদেশের কারণে সমস্যার কারণে তৈরি হয় এবং এটি গতিশীলভাবে বরাদ্দ করতে পারে না ব্যবহার new
করার সময় আরো মধ্যে গভীরতা আরম্ভের স্কিম কি প্রশ্ন বস্তুর জন্য প্রয়োজনীয় পরলোক হতে পারে; বিবক্ষিত, এই প্রধানত এমবেডেড সিস্টেম যে সি ++ ব্যবহার করুন) উপর একটি বিষয়।
'সি' তে বিভিন্ন সুযোগ সম্পর্কে কথা বলা যাক
স্কোপ: এটি মূলত আমি কতক্ষণ দেখতে পারি এবং কতদূর।
স্থানীয় পরিবর্তনশীল: স্কোপটি কেবল কোনও ফাংশনের অভ্যন্তরে থাকে। এটি র্যামের স্ট্যাক এলাকায় বাস করে। যার অর্থ হ'ল প্রতিবার কোনও ক্রিয়াকলাপটি ফাংশনের আর্গুমেন্টগুলি সহ যে সমস্ত ভেরিয়েবলগুলি function ফাংশনের অংশ হিসাবে ডাকা হয় তা তাজা করে তৈরি করা হয় এবং নিয়ন্ত্রণটি ফাংশনটির বাইরে চলে যাওয়ার পরে তা ধ্বংস হয়ে যায়। (কারণ প্রতিটি ফাংশন ফিরলে স্ট্যাকটি ফ্লাশ করা হয়েছে)
স্ট্যাটিক ভেরিয়েবল: এর ব্যাপ্তি একটি ফাইলের জন্য। এটি যে ফাইলটিতে
এটি ঘোষিত হয়েছে সেখানে যেখানেই এটি অ্যাক্সেসযোগ্য । এটি র্যামের ডেটা বিভাগে থাকে। যেহেতু এটি কেবলমাত্র একটি ফাইলের অভ্যন্তরে অ্যাক্সেস করা যায় এবং তাই আন্তঃসংযোগ। কোন
অন্যান্য ফাইল এই পরিবর্তনশীল দেখতে পারে না। প্রকৃতপক্ষে স্ট্যাটিক কীওয়ার্ড হ'ল একমাত্র উপায় যার মাধ্যমে আমরা
'সি' তে লুকিয়ে থাকা কিছু স্তরের ডেটা বা ফাংশন প্রবর্তন করতে পারি
গ্লোবাল ভেরিয়েবল: এর ব্যাপ্তি পুরো প্রয়োগের জন্য। এটি অ্যাপ্লিকেশনের যেখানেই অ্যাক্সেসযোগ্য ফর্ম। গ্লোবাল ভেরিয়েবলগুলি ডেটা বিভাগেও বাস করে যেহেতু অ্যাপ্লিকেশনটিতে যেখানেই এটি অ্যাক্সেস করা যায় এবং তাই বহিরাগত লিঙ্কেজ
ডিফল্টরূপে সমস্ত ফাংশন বৈশ্বিক are যদি আপনাকে বাইরে থেকে কোনও ফাইলে কিছু ফাংশন আড়াল করতে হয় তবে আপনি স্থির কীওয়ার্ডটি ফাংশনে উপসর্গ করতে পারেন। :-)
প্রশ্নটি সম্পর্কে কথা বলার আগে, শব্দটি অনুবাদ ইউনিট , প্রোগ্রাম এবং সি ++ এর কিছু প্রাথমিক ধারণাটি (আসলে লিঙ্কেজটি সাধারণভাবে তাদের মধ্যে একটি) সাধারণভাবে জানা ভাল। আপনার সুযোগও কী তা জানতে হবে ।
আমি কয়েকটি মূল বিষয়গুলিতে জোর দেব, esp। পূর্বের উত্তরে অনুপস্থিত।
লিঙ্কেজ একটি নামের সম্পত্তি , যা একটি ঘোষণার মাধ্যমে প্রবর্তিত হয় । বিভিন্ন নাম একই সত্তাকে বোঝাতে পারে (সাধারণত, কোনও বস্তু বা কোনও ক্রিয়া)। তাই লিঙ্কেজের কথা বলছি সত্তার সাধারণত বোকামি, আপনি যদি নিশ্চিত হন না যে সত্তাটি নির্দিষ্ট নির্দিষ্ট ঘোষণার (সাধারণত একটি ঘোষণা, যদিও) অনন্য নাম দ্বারা উল্লেখ করা হবে।
নোট করুন কোনও বস্তু একটি সত্তা, তবে একটি পরিবর্তনশীল নয়। কোনও ভেরিয়েবলের সংযোগ সম্পর্কে কথা বলার সময়, প্রকৃতপক্ষে বর্ণিত সত্তার নাম (যা একটি নির্দিষ্ট ঘোষণার মাধ্যমে প্রবর্তিত) উদ্বিগ্ন। নামের সংযোগটি তিনটির মধ্যে একটিতে রয়েছে: কোনও সংযোগ, অভ্যন্তরীণ লিঙ্কেজ বা বাহ্যিক সংযোগ নেই।
বিভিন্ন অনুবাদ ইউনিট একই শিরোনাম / উত্স ফাইল (হ্যাঁ, এটি স্ট্যান্ডার্ডের শব্দটি) অন্তর্ভুক্তির মাধ্যমে একই ঘোষণা ভাগ করতে পারে। সুতরাং আপনি একই অনুবাদটি বিভিন্ন অনুবাদ ইউনিটে উল্লেখ করতে পারেন। যদি ঘোষিত নামেরটির বাহ্যিক সংযোগ থাকে তবে নামটি উল্লেখ করা সত্তার পরিচয়টিও ভাগ করা যায়। ঘোষিত নামটির অভ্যন্তরীণ যোগসূত্র থাকলে, বিভিন্ন অনুবাদ ইউনিটে একই নাম বিভিন্ন সত্তাকে বোঝায়, তবে আপনি একই অনুবাদ ইউনিটের বিভিন্ন স্কোপে সত্তাটিকে উল্লেখ করতে পারেন। যদি নামের কোনও যোগসূত্র না থাকে, আপনি কেবল অন্য স্কোপ থেকে সত্তাটি উল্লেখ করতে পারবেন না।
(ওহো ... আমি যা লিখেছি তা পেয়েছি কিছুটা মাত্র স্ট্যান্ডার্ড ওয়ার্ডিংয়ের পুনরাবৃত্তি ...)
আরও কিছু বিভ্রান্তিমূলক বিষয় রয়েছে যা ভাষার নির্দিষ্টকরণের আওতায় আসে না।
__attribute__
বা__declspec
) বা সংকলক বিকল্পগুলি, এবং চিত্রটি পুরো প্রোগ্রাম বা কোনও অনুবাদ ইউনিট থেকে অনুবাদ করা অবজেক্ট ফাইল নয়, সুতরাং কোনও মানক ধারণা এটিকে সঠিকভাবে বর্ণনা করতে পারে না। যেহেতু প্রতীক সি ++ এ কোনও আদর্শিক পদ নয়, তাই এটি কেবল একটি বাস্তবায়নের বিশদ, যদিও উপভাষার সম্পর্কিত বর্ধনগুলি ব্যাপকভাবে গ্রহণ করা যেতে পারে।নামস্থান পরিধি দুটো ঘটনার নিয়ম const
পরিবর্তনশীল বিশেষ কিছু (এবং বিশেষ করে বিভিন্ন হয় const
বস্তুর সি ল্যাঙ্গুয়েজ যা অভিন্ন পরিচয় দুটো ঘটনার ধারণা হয়েছে ফাইল সুযোগ ঘোষণা)। যেহেতু ওডিআর সি ++ দ্বারা প্রয়োগ করা হয়, তাই পুরো প্রোগ্রামে inline
ফাংশন ব্যতীত একই পরিবর্তনশীল বা ফাংশনটির একাধিক সংজ্ঞা রাখা উচিত নয় । যদি এরকম কোনও বিশেষ নিয়ম না থাকে তবে একাধিক অনুবাদ ইউনিট অন্তর্ভুক্ত (বা একাধিক অনুবাদ ইউনিট দ্বারা একাধিক অনুবাদ ইউনিট অন্তর্ভুক্ত), শিরোনাম বা উত্স ফাইলে (প্রায়শই একটি "শিরোনাম ফাইল") এর সাথে প্রাথমিককরণ (উদাহরণস্বরূপ ) সহ ভেরিয়েবলের const
একটি সহজ ঘোষণা , যদিও খুব কমই) কোনও প্রোগ্রামে ওডিআর লঙ্ঘন করবে, যা ব্যবহারের সুযোগ করে দেয়const
= xxx
const
কিছু বস্তুর মতো ম্যাক্রোর প্রতিস্থাপন হিসাবে অসম্ভব ভেরিয়েবল।
আমি মনে করি সি ++ এর অভ্যন্তরীণ এবং বাহ্যিক সংযোগটি একটি স্পষ্ট এবং সংক্ষিপ্ত ব্যাখ্যা দেয়:
একটি অনুবাদ ইউনিট একটি বাস্তবায়ন (.c / .cpp) ফাইল এবং এতে অন্তর্ভুক্ত সমস্ত শিরোনাম (.h / .hpp) ফাইলগুলি বোঝায়। যদি কোনও অনুবাদ ইউনিটের অভ্যন্তরে কোনও বস্তু বা ফাংশনের অভ্যন্তরীণ লিঙ্কেজ থাকে, তবে সেই নির্দিষ্ট চিহ্নটি কেবল সেই অনুবাদ ইউনিটের মধ্যেই লিঙ্কারের কাছে দৃশ্যমান। যদি কোনও বস্তু বা ফাংশনে বাহ্যিক সংযোগ থাকে তবে লিঙ্কার অন্যান্য অনুবাদ ইউনিটগুলি প্রক্রিয়া করার সময় এটি দেখতেও পায়। স্ট্যাটিক কীওয়ার্ড, যখন বিশ্বব্যাপী নেমস্পেসে ব্যবহৃত হয়, প্রতীকটিকে অভ্যন্তরীণ সংযোগ স্থাপনে বাধ্য করে। বাহ্যিক কীওয়ার্ডের ফলে বাহ্যিক সংযোগ রয়েছে এমন প্রতীক তৈরি হয়।
সংকলক চিহ্নগুলির সংযোগকে ডিফল্ট করে যে:
কনস্ট্যান্ট গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে বাহ্যিক সংযোগ থাকে
কনস্ট গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে অভ্যন্তরীণ সংযোগ থাকে
ফাংশনগুলির ডিফল্টরূপে বাহ্যিক সংযোগ থাকে
লিঙ্কেজ নির্ধারণ করে যে সনাক্তকারীদের অভিন্ন নামগুলি একই বস্তু, ফাংশন বা অন্যান্য সত্তাকে রেফার করে কিনা, এমনকি যদি সেই শনাক্তকারীরা বিভিন্ন অনুবাদ ইউনিটে উপস্থিত হয়। কোনও শনাক্তকারীর লিঙ্কেজ কীভাবে এটি ঘোষিত হয়েছিল তার উপর নির্ভর করে। তিন ধরণের লিঙ্কেজ রয়েছে:
কেবলমাত্র সি ++ : আপনি সি ++ এবং নন-সি ++ কোড টুকরাগুলির মধ্যেও যোগসূত্র রাখতে পারেন, যাকে ভাষা সংযোগ বলে ।
সূত্র: আইবিএম প্রোগ্রাম লিংকেজ
মূলত
extern linkage
পরিবর্তনশীল সমস্ত ফাইলের মধ্যে দৃশ্যমানinternal linkage
ভেরিয়েবল একক ফাইলে দৃশ্যমান।ব্যাখ্যা করুন: কনস্ট ভেরিয়েবলগুলি অভ্যন্তরীণভাবে ডিফল্টরূপে লিঙ্ক হয় অন্যথায় বাহ্যিক হিসাবে ঘোষণা না করে
external linkage
const
বৈশ্বিক পরিবর্তনশীল isinternal linkage
extern const
গ্লোবাল ভেরিয়েবল হয়external linkage
সি ++ এ লিঙ্কেজ সম্পর্কে একটি খুব ভাল উপাদান
http://www.goldsborough.me/c/c++/linker/2016/03/30/19-34-25-internal_and_external_linkage_in_c++/
সি ++ এ
ফাইল স্কোপে যে কোনও পরিবর্তনশীল এবং এটি কোনও শ্রেণি বা ফাংশনের অভ্যন্তরে বাসা বাঁধে না, কোনও প্রোগ্রামে সমস্ত অনুবাদ ইউনিট জুড়ে দৃশ্যমান। এটিকে বাহ্যিক লিঙ্কেজ বলা হয় কারণ লিঙ্ক সময়ে নামটি লিঙ্কারের কাছে সর্বত্র দেখা যায়, সেই অনুবাদ ইউনিটের বাহ্যিক।
গ্লোবাল ভেরিয়েবল এবং সাধারণ ফাংশনগুলির বাহ্যিক সংযোগ রয়েছে।
ফাইল স্কোপে স্থির বস্তু বা ফাংশনের নাম অনুবাদ ইউনিটে স্থানীয়। এটিকে অভ্যন্তরীণ লিঙ্কেজ বলা হয়
লিঙ্কেজ কেবলমাত্র সেই উপাদানগুলিকে বোঝায় যেগুলির লিঙ্ক / লোডের সময় ঠিকানা রয়েছে; সুতরাং, শ্রেণীর ঘোষণা এবং স্থানীয় ভেরিয়েবলের কোনও যোগসূত্র নেই।