বাহ্যিক সংযোগ এবং অভ্যন্তরীণ সংযোগ কী?


337

আমি বাহ্যিক সংযোগ এবং অভ্যন্তরীণ সংযোগ এবং তাদের পার্থক্য বুঝতে চাই।

আমি এর অর্থও জানতে চাই

constভেরিয়েবলগুলি অভ্যন্তরীণভাবে ডিফল্টরূপে লিঙ্ক হয় অন্যথায় হিসাবে ঘোষণা না করে extern

উত্তর:


278

যখন আপনি একটি বাস্তবায়ন ফাইলটি লিখতে ( .cpp, .cxxইত্যাদি) আপনার কম্পাইলার একটি উত্পন্ন অনুবাদ ইউনিট । এটি আপনার প্রয়োগের উত্স ফাইল এবং এতে যে সমস্ত শিরোলেখ রয়েছে #include

অভ্যন্তরীণ সংযোগ কেবল একটি অনুবাদ ইউনিটের সুযোগগুলিতে সমস্ত কিছুকে বোঝায় ।

বাহ্যিক সংযোগ এমন কিছু জিনিসকে বোঝায় যা একটি নির্দিষ্ট অনুবাদ ইউনিটের বাইরে রয়েছে। অন্য কথায়, পুরো প্রোগ্রামের মাধ্যমে অ্যাক্সেসযোগ্য , যা সমস্ত অনুবাদ ইউনিট (বা অবজেক্ট ফাইল) এর সমন্বয়।


112
আমি একটি ত্রুটি ব্যতীত এটিকে উপস্থাপন করব: একটি অনুবাদ ইউনিট "কোনওভাবে অবজেক্ট ফাইল" নয়, এটি উত্স কোড যা থেকে সংকলকটি বস্তু ফাইল তৈরি করে।
এসবিআই

4
@ ফ্র্যাঙ্কএইচবি, উত্তরটি অনুপস্থিত যে "আরও গুরুত্বপূর্ণ কিছু"?
গণিতবিদ

2
@ গণিতবিদ দেরী করার জন্য দুঃখিত ... আমি মনে করি সমস্যাটি স্পষ্ট হওয়া উচিত (শব্দের যথার্থতা ছাড়াও) এই উত্তরটি অসম্পূর্ণ, কারণ এখানে constভেরিয়েবলের নিয়ম (সেইসাথে এর উদ্দেশ্য) সম্পর্কে প্রশ্নটি পুরোপুরি মিস হয়েছে।
ফ্র্যাঙ্কএইচবি

293

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

আপনি ব্যবহার করে প্রতীকের যোগসূত্রটি স্পষ্টভাবে নিয়ন্ত্রণ করতে পারেন externstatic কীওয়ার্ড এবং কীওয়ার্ড । যদি লিঙ্কেজটি নির্দিষ্ট না করা থাকে তবে ডিফল্ট সংযোগটি 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 { };
}

11
"রফতানি" কীওয়ার্ডটির প্রয়োগটি 'স্ট্যাটিক' হিসাবে ঘোষিত একটি ফাংশন এবং নামবিহীন নেমস্পেসে ঘোষিত একটি ফাংশনের মধ্যে পার্থক্য তুলে ধরে। সেরা হিসাবে আমি করতে পারি সংক্ষিপ্তসার হিসাবে, একটি অনুবাদ ইউনিটে রফতানি কীওয়ার্ড সহ ঘোষিত একটি ফাংশন টেম্পলেট 2-পর্বের অনুসন্ধানের ফলাফল হিসাবে ভিন্ন অনুবাদ ইউনিটের একটি নামবিহীন নামস্থলে সংজ্ঞায়িত ফাংশনকে বোঝাতে পারে। ( ddj.com/showArticle.jhtml?articleID=184401584 )
রিচার্ড কর্ডেন

আমি যদি নিম্নলিখিতগুলি করি তবে কী হবে: 1.cpp <code> const int ci; </code> 2cpp <code> extern const int ci; </code>
রাজেন্দ্র উৎপল

2
@ রাজেনদা আপনি একটি অমীমাংসিত প্রতীক ত্রুটি পাবেন (উত্তর দেওয়ার ক্ষেত্রে নয় মাসের বিলম্বের জন্য দুঃখিত আমি এই মন্তব্যটি মিস করেছি)।
মোটি

4
তথ্য যা এই উত্তরটিকে ব্যাপকভাবে বাড়িয়ে তুলতে পারে: 1) স্থির আর C ++ 11 এ অবমূল্যায়ন করা হয় না। 2) সি ++ 11 এ বেনামে নেমস্পেস সদস্যদের ডিফল্টরূপে অভ্যন্তরীণ লিঙ্কেজ রয়েছে। দেখুন stackoverflow.com/questions/10832940/...
Klaim

2
এর অর্থ "বাহ্যিক সংযোগ তবে অন্য অনুবাদ ইউনিট থেকে অ্যাক্সেসযোগ্য"? এটি অ্যাক্সেসযোগ্য তবে তবুও বাহ্যিক কীভাবে হতে পারে?
szx

101
  • গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে বাহ্যিক সংযোগ থাকে । এর স্কোপটি অন্য ফাইলগুলিতে একটি ম্যাচিং externডিক্লারেশন দিয়ে এটি ধারণ করা ছাড়া অন্য ফাইলগুলিতে বাড়ানো যেতে পারে ।
  • বিশ্বব্যাপী ভেরিয়েবলের ব্যাপ্তি কীওয়ার্ডের সাহায্যে ঘোষণার উপসর্গ করে তার ঘোষণামূলক ফাইলের মধ্যে সীমাবদ্ধ থাকতে পারে static। এ জাতীয় ভেরিয়েবলগুলির অভ্যন্তরীণ সংযোগ রয়েছে বলে জানা যায় ।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

1.cpp

void f(int i);
extern const int max = 10;
int n = 0;
int main()
{
    int a;
    //...
    f(a);
    //...
    f(a);
    //...
}
  1. বাহ্যিক সংযোগ (ডিফল্ট) সহ ফাংশনের স্বাক্ষর একটি ফাংশন হিসাবে fঘোষণা করে । এর সংজ্ঞাটি অবশ্যই এই ফাইলে বা অন্য অনুবাদ ইউনিটে সরবরাহ করতে হবে (নীচে দেওয়া হয়েছে)।f
  2. maxএকটি সংখ্যার ধ্রুবক হিসাবে সংজ্ঞায়িত করা হয়। ধ্রুবকগুলির জন্য ডিফল্ট সংযোগটি অভ্যন্তরীণ । এর সংযোগটি কীওয়ার্ডের সাহায্যে বহিরাগতে পরিবর্তিত হয়েছে extern। তাই এখনmax অন্যান্য ফাইল অ্যাক্সেস করা যেতে পারে।
  3. nএকটি পূর্ণসংখ্যা পরিবর্তনশীল হিসাবে সংজ্ঞায়িত করা হয়। ভেরিয়েবলের জন্য ডিফল্ট লিঙ্কেজটি ফাংশন বডিগুলির বাইরে সংজ্ঞায়িত করা হয়বহিরাগত বাহ্যিক

2.cpp

#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;
}
  1. max আছে ঘোষণা করা হয় বাহ্যিক সংযোগmax(বাহ্যিক সংযোগ সহ) এর জন্য একটি মিলের সংজ্ঞা অবশ্যই কিছু ফাইলে উপস্থিত হবে। (যেমন 1.cpp তে)
  2. nবাহ্যিক সংযোগ আছে বলে ঘোষণা করা হয় ।
  3. zহয় সংজ্ঞায়িত সঙ্গে একটি বিশ্বব্যাপী পরিবর্তনশীল হিসাবে অভ্যন্তরীণ দুটো ঘটনার
  4. একটি পরিবর্তনশীল হিসাবে nCallনির্দিষ্ট nCallকরার সংজ্ঞাটি ফাংশন করার জন্য কলগুলির জুড়ে এর মান ধরে রাখে f()। ডিফল্ট অটো স্টোরেজ ক্লাসের সাথে স্থানীয় ভেরিয়েবলগুলির বিপরীতে nCall, প্রোগ্রামের শুরুতে একবার একবার আরম্ভ করা হবে এবং প্রতিটি অনুরোধের জন্য একবার নয়f() । স্টোরেজ ক্লাস স্পেসিফায়ার staticস্থানীয় ভেরিয়েবলের জীবদ্দশায় প্রভাব ফেলে না এবং এর পরিধিটি নয়।

এনবি: কীওয়ার্ডটি staticদ্বৈত ভূমিকা পালন করে। গ্লোবাল ভেরিয়েবলের সংজ্ঞা হিসাবে ব্যবহৃত হয়, এটি নির্দিষ্ট করে অভ্যন্তরীণ লিঙ্কেজ । যখন স্থানীয় ভেরিয়েবলের সংজ্ঞা ব্যবহৃত হয়, এটি নির্দিষ্ট করে যে ভেরিয়েবলের আজীবন কর্মসূচির সময়কাল না হয়ে প্রোগ্রামের সময়কাল হতে চলেছে।

আশা করি এইটি কাজ করবে!


2
গুরুত্বপূর্ণভাবে, যখন স্থানীয় ভেরিয়েবলগুলির সংজ্ঞায় ব্যবহৃত হয়, staticঅলস একক সূচনা করার অনুমতি দেয় (এটি কার্যকর হতে পারে যদি আপনাকে গ্লোবাল-ইশ অবজেক্টের প্রয়োজন হয় তবে এটি নিয়ন্ত্রণ করতে হবে যখন এটি বিশ্বব্যাপী নির্মাণ আদেশের কারণে সমস্যার কারণে তৈরি হয় এবং এটি গতিশীলভাবে বরাদ্দ করতে পারে না ব্যবহার newকরার সময় আরো মধ্যে গভীরতা আরম্ভের স্কিম কি প্রশ্ন বস্তুর জন্য প্রয়োজনীয় পরলোক হতে পারে; বিবক্ষিত, এই প্রধানত এমবেডেড সিস্টেম যে সি ++ ব্যবহার করুন) উপর একটি বিষয়।
জ্যাব

1
খুব ভাল পরীক্ষা, আমার দিন তৈরি।
রক্ত-হাজ্জারা

28

'সি' এর ক্ষেত্রে (কারণ স্থির কীওয়ার্ডের 'সি' এবং 'সি ++' এর মধ্যে আলাদা অর্থ রয়েছে)

'সি' তে বিভিন্ন সুযোগ সম্পর্কে কথা বলা যাক

স্কোপ: এটি মূলত আমি কতক্ষণ দেখতে পারি এবং কতদূর।

  1. স্থানীয় পরিবর্তনশীল: স্কোপটি কেবল কোনও ফাংশনের অভ্যন্তরে থাকে। এটি র‌্যামের স্ট্যাক এলাকায় বাস করে। যার অর্থ হ'ল প্রতিবার কোনও ক্রিয়াকলাপটি ফাংশনের আর্গুমেন্টগুলি সহ যে সমস্ত ভেরিয়েবলগুলি function ফাংশনের অংশ হিসাবে ডাকা হয় তা তাজা করে তৈরি করা হয় এবং নিয়ন্ত্রণটি ফাংশনটির বাইরে চলে যাওয়ার পরে তা ধ্বংস হয়ে যায়। (কারণ প্রতিটি ফাংশন ফিরলে স্ট্যাকটি ফ্লাশ করা হয়েছে)

  2. স্ট্যাটিক ভেরিয়েবল: এর ব্যাপ্তি একটি ফাইলের জন্য। এটি যে ফাইলটিতে
    এটি ঘোষিত হয়েছে সেখানে যেখানেই এটি অ্যাক্সেসযোগ্য । এটি র‌্যামের ডেটা বিভাগে থাকে। যেহেতু এটি কেবলমাত্র একটি ফাইলের অভ্যন্তরে অ্যাক্সেস করা যায় এবং তাই আন্তঃসংযোগ। কোন
    অন্যান্য ফাইল এই পরিবর্তনশীল দেখতে পারে না। প্রকৃতপক্ষে স্ট্যাটিক কীওয়ার্ড হ'ল একমাত্র উপায় যার মাধ্যমে আমরা
    'সি' তে লুকিয়ে থাকা কিছু স্তরের ডেটা বা ফাংশন প্রবর্তন করতে পারি

  3. গ্লোবাল ভেরিয়েবল: এর ব্যাপ্তি পুরো প্রয়োগের জন্য। এটি অ্যাপ্লিকেশনের যেখানেই অ্যাক্সেসযোগ্য ফর্ম। গ্লোবাল ভেরিয়েবলগুলি ডেটা বিভাগেও বাস করে যেহেতু অ্যাপ্লিকেশনটিতে যেখানেই এটি অ্যাক্সেস করা যায় এবং তাই বহিরাগত লিঙ্কেজ

ডিফল্টরূপে সমস্ত ফাংশন বৈশ্বিক are যদি আপনাকে বাইরে থেকে কোনও ফাইলে কিছু ফাংশন আড়াল করতে হয় তবে আপনি স্থির কীওয়ার্ডটি ফাংশনে উপসর্গ করতে পারেন। :-)


12
@ লাইবিন: ১ হিসাবে স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের মধ্যে থাকতে হবে না - তারা সাধারণত স্ট্যাকের মধ্যে থাকে তবে রেজিস্টারে থাকতে পারে এবং এআরএম পরিবেশে তারা স্ট্যাকের চেয়ে রেজিস্টারে বেশি থাকে (কিছু কারণের উপর নির্ভর করে - কল স্তর, নম্বর) আনুষ্ঠানিক অর্গগুলির ..)
আর্তুর

4
@ লাইবিন: ১ হিসাবে) যদি আপনি 'ফ্লাশ' কে ওভাররাইট হিসাবে বিবেচনা করেন - এটি ভুল। স্ট্যাক পয়েন্টারটি সবেমাত্র আলাদা জায়গায় সরানো হয়েছে। কোনও 'পূর্বে বৈধ লোকাল ওয়ার' 'ফ্লাশ' / সাফ করা হয় না You আপনি সঞ্চয়স্থানের সময়কালের সাথে ভেরিয়েবল স্কোপ মেশান। স্কোপটি বলে যে আপনি কোথা থেকে কোনও ভারতে অ্যাক্সেস করতে পারবেন। সঞ্চয়ের সময়কাল এটি কতক্ষণ বিদ্যমান তা বলে। স্ট্যাটিক স্টোরেজ সময়কাল সহ আপনার স্থানীয় ভেরিয়েবল থাকতে পারে। এর মানে এটা বসবাস "সব সময় প্রবেশ করুন" কিন্তু একটি ফাংশন এতে ঘোষিত হয় থেকে অ্যাক্সেস করা যেতে পারে।
মধ্যে Artur

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

@ আরতুর আমি মনে করি আপনি " শুধুমাত্র "টিকে " ভুলে গেছেন "এর অর্থ এটি" চিরকাল বেঁচে থাকে "তবে এটি যে ফাংশন হিসাবে ঘোষিত হয়েছিল তা থেকে কেবলমাত্র (কেবলমাত্র) অ্যাক্সেস করা যায় " - এটি একটি গুরুত্বপূর্ণ বিবরণ, তাই আমি উল্লেখ করতে চাই যে স্পষ্টভাবে আউট।
রবার্টস

1
@ রবার্টসপোর্টস মনিকাসেলিও - আপনি ঠিক বলেছেন
আর্টুর

14

প্রশ্নটি সম্পর্কে কথা বলার আগে, শব্দটি অনুবাদ ইউনিট , প্রোগ্রাম এবং সি ++ এর কিছু প্রাথমিক ধারণাটি (আসলে লিঙ্কেজটি সাধারণভাবে তাদের মধ্যে একটি) সাধারণভাবে জানা ভাল। আপনার সুযোগও কী তা জানতে হবে ।

আমি কয়েকটি মূল বিষয়গুলিতে জোর দেব, esp। পূর্বের উত্তরে অনুপস্থিত।

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

নোট করুন কোনও বস্তু একটি সত্তা, তবে একটি পরিবর্তনশীল নয়। কোনও ভেরিয়েবলের সংযোগ সম্পর্কে কথা বলার সময়, প্রকৃতপক্ষে বর্ণিত সত্তার নাম (যা একটি নির্দিষ্ট ঘোষণার মাধ্যমে প্রবর্তিত) উদ্বিগ্ন। নামের সংযোগটি তিনটির মধ্যে একটিতে রয়েছে: কোনও সংযোগ, অভ্যন্তরীণ লিঙ্কেজ বা বাহ্যিক সংযোগ নেই।

বিভিন্ন অনুবাদ ইউনিট একই শিরোনাম / উত্স ফাইল (হ্যাঁ, এটি স্ট্যান্ডার্ডের শব্দটি) অন্তর্ভুক্তির মাধ্যমে একই ঘোষণা ভাগ করতে পারে। সুতরাং আপনি একই অনুবাদটি বিভিন্ন অনুবাদ ইউনিটে উল্লেখ করতে পারেন। যদি ঘোষিত নামেরটির বাহ্যিক সংযোগ থাকে তবে নামটি উল্লেখ করা সত্তার পরিচয়টিও ভাগ করা যায়। ঘোষিত নামটির অভ্যন্তরীণ যোগসূত্র থাকলে, বিভিন্ন অনুবাদ ইউনিটে একই নাম বিভিন্ন সত্তাকে বোঝায়, তবে আপনি একই অনুবাদ ইউনিটের বিভিন্ন স্কোপে সত্তাটিকে উল্লেখ করতে পারেন। যদি নামের কোনও যোগসূত্র না থাকে, আপনি কেবল অন্য স্কোপ থেকে সত্তাটি উল্লেখ করতে পারবেন না।

(ওহো ... আমি যা লিখেছি তা পেয়েছি কিছুটা মাত্র স্ট্যান্ডার্ড ওয়ার্ডিংয়ের পুনরাবৃত্তি ...)

আরও কিছু বিভ্রান্তিমূলক বিষয় রয়েছে যা ভাষার নির্দিষ্টকরণের আওতায় আসে না।

  1. দৃশ্যমানতা (একটি নাম) এটি ঘোষিত নামের একটি সম্পত্তি, তবে সংযোগের সাথে পৃথক একটি অর্থ
  2. দৃশ্যমানতা (একটি পার্শ্ব প্রতিক্রিয়া) । এটি এই বিষয়ের সাথে সম্পর্কিত নয়।
  3. দৃশ্যমানতা (একটি প্রতীক)। এই ধারণাটি বাস্তব বাস্তবায়ন দ্বারা ব্যবহার করা যেতে পারে । এই ধরনের বাস্তবায়নে, অবজেক্টের (বাইনারি) কোডে সুনির্দিষ্ট দৃশ্যমানতা সহ একটি প্রতীক সাধারণত সত্তা সংজ্ঞা থেকে উত্সযুক্ত সংক্ষিপ্তসার থেকে চিহ্নিত করা হয় যার নামগুলির উত্স (সি ++) কোডে একই নির্দিষ্ট লিঙ্কযুক্ত থাকে। তবে এটি সাধারণত এক থেকে একের জন্য গ্যারান্টিযুক্ত হয় না। উদাহরণস্বরূপ, গতিশীল লাইব্রেরি চিত্রের একটি চিহ্ন কেবল উত্স কোড থেকে অভ্যন্তরীণভাবে সেই চিত্রটিতে ভাগ করা নির্দিষ্ট করা যেতে পারে (কিছু এক্সটেনশনের সাথে জড়িত, সাধারণত,__attribute__ বা__declspec) বা সংকলক বিকল্পগুলি, এবং চিত্রটি পুরো প্রোগ্রাম বা কোনও অনুবাদ ইউনিট থেকে অনুবাদ করা অবজেক্ট ফাইল নয়, সুতরাং কোনও মানক ধারণা এটিকে সঠিকভাবে বর্ণনা করতে পারে না। যেহেতু প্রতীক সি ++ এ কোনও আদর্শিক পদ নয়, তাই এটি কেবল একটি বাস্তবায়নের বিশদ, যদিও উপভাষার সম্পর্কিত বর্ধনগুলি ব্যাপকভাবে গ্রহণ করা যেতে পারে।
  4. অভিগম্যতা। সি ++ এ, এটি সাধারণত শ্রেণীর সদস্যদের বা বেস ক্লাসগুলির সম্পত্তি সম্পর্কে , যা আবার এই বিষয়ের সাথে সম্পর্কিত নয় একটি ভিন্ন ধারণা।
  5. গ্লোবাল। সি ++ তে, "গ্লোবাল" গ্লোবাল নেমস্পেস বা গ্লোবাল নেমস্পেস স্কোপের কিছু বোঝায়। পরবর্তীটি সি ভাষায় ফাইল স্কোপের সমতুল্য । সি এবং সি ++ উভয় ক্ষেত্রেই যোগসূত্রটির সুযোগের সাথে কোনও সম্পর্ক নেই যদিও স্কোপ (লিঙ্কেজের মতো) কিছু ঘোষণাপত্রের দ্বারা প্রবর্তিত কোনও সনাক্তকারী (সিতে) বা একটি নাম (সি ++ তে) সম্পর্কেও দৃ tight়ভাবে সম্পর্কিত is

নামস্থান পরিধি দুটো ঘটনার নিয়ম constপরিবর্তনশীল বিশেষ কিছু (এবং বিশেষ করে বিভিন্ন হয় constবস্তুর সি ল্যাঙ্গুয়েজ যা অভিন্ন পরিচয় দুটো ঘটনার ধারণা হয়েছে ফাইল সুযোগ ঘোষণা)। যেহেতু ওডিআর সি ++ দ্বারা প্রয়োগ করা হয়, তাই পুরো প্রোগ্রামে inlineফাংশন ব্যতীত একই পরিবর্তনশীল বা ফাংশনটির একাধিক সংজ্ঞা রাখা উচিত নয় । যদি এরকম কোনও বিশেষ নিয়ম না থাকে তবে একাধিক অনুবাদ ইউনিট অন্তর্ভুক্ত (বা একাধিক অনুবাদ ইউনিট দ্বারা একাধিক অনুবাদ ইউনিট অন্তর্ভুক্ত), শিরোনাম বা উত্স ফাইলে (প্রায়শই একটি "শিরোনাম ফাইল") এর সাথে প্রাথমিককরণ (উদাহরণস্বরূপ ) সহ ভেরিয়েবলের constএকটি সহজ ঘোষণা , যদিও খুব কমই) কোনও প্রোগ্রামে ওডিআর লঙ্ঘন করবে, যা ব্যবহারের সুযোগ করে দেয়const= xxxconst কিছু বস্তুর মতো ম্যাক্রোর প্রতিস্থাপন হিসাবে অসম্ভব ভেরিয়েবল।


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

8

আমি মনে করি সি ++ এর অভ্যন্তরীণ এবং বাহ্যিক সংযোগটি একটি স্পষ্ট এবং সংক্ষিপ্ত ব্যাখ্যা দেয়:

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

সংকলক চিহ্নগুলির সংযোগকে ডিফল্ট করে যে:

কনস্ট্যান্ট গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে বাহ্যিক সংযোগ থাকে
কনস্ট গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে অভ্যন্তরীণ সংযোগ থাকে
ফাংশনগুলির ডিফল্টরূপে বাহ্যিক সংযোগ থাকে


6

লিঙ্কেজ নির্ধারণ করে যে সনাক্তকারীদের অভিন্ন নামগুলি একই বস্তু, ফাংশন বা অন্যান্য সত্তাকে রেফার করে কিনা, এমনকি যদি সেই শনাক্তকারীরা বিভিন্ন অনুবাদ ইউনিটে উপস্থিত হয়। কোনও শনাক্তকারীর লিঙ্কেজ কীভাবে এটি ঘোষিত হয়েছিল তার উপর নির্ভর করে। তিন ধরণের লিঙ্কেজ রয়েছে:

  1. অভ্যন্তরীণ লিঙ্কেজ : সনাক্তকারীরা কেবল অনুবাদ ইউনিটের মধ্যেই দেখা যায়।
  2. বাহ্যিক সংযোগ : সনাক্তকারীরা অন্যান্য অনুবাদ ইউনিটে দেখা যায় (এবং উল্লেখ করা যায়)।
  3. কোনও সংযুক্তি নেই : শনাক্তকারীরা কেবলমাত্র তাদের স্কোপেই দেখা যাবে যেখানে তারা সংজ্ঞায়িত হয়েছে। লিঙ্কেজ স্কোপিংকে প্রভাবিত করে না

কেবলমাত্র সি ++ : আপনি সি ++ এবং নন-সি ++ কোড টুকরাগুলির মধ্যেও যোগসূত্র রাখতে পারেন, যাকে ভাষা সংযোগ বলে

সূত্র: আইবিএম প্রোগ্রাম লিংকেজ


5

মূলত

  • extern linkage পরিবর্তনশীল সমস্ত ফাইলের মধ্যে দৃশ্যমান
  • internal linkage ভেরিয়েবল একক ফাইলে দৃশ্যমান।

ব্যাখ্যা করুন: কনস্ট ভেরিয়েবলগুলি অভ্যন্তরীণভাবে ডিফল্টরূপে লিঙ্ক হয় অন্যথায় বাহ্যিক হিসাবে ঘোষণা না করে

  1. ডিফল্টরূপে, গ্লোবাল ভেরিয়েবল হয় external linkage
  2. তবে, constবৈশ্বিক পরিবর্তনশীল isinternal linkage
  3. অতিরিক্ত, extern constগ্লোবাল ভেরিয়েবল হয়external linkage

সি ++ এ লিঙ্কেজ সম্পর্কে একটি খুব ভাল উপাদান

http://www.goldsborough.me/c/c++/linker/2016/03/30/19-34-25-internal_and_external_linkage_in_c++/


1

সি ++ এ

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

গ্লোবাল ভেরিয়েবল এবং সাধারণ ফাংশনগুলির বাহ্যিক সংযোগ রয়েছে।

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

লিঙ্কেজ কেবলমাত্র সেই উপাদানগুলিকে বোঝায় যেগুলির লিঙ্ক / লোডের সময় ঠিকানা রয়েছে; সুতরাং, শ্রেণীর ঘোষণা এবং স্থানীয় ভেরিয়েবলের কোনও যোগসূত্র নেই।


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