আপনাকে দুটি পৃথক ধারণার মধ্যে পার্থক্য করতে হবে: ফাংশন সংজ্ঞা এবং প্রতীক ঘোষণার। "বাহ্যিক" হ'ল লিঙ্কেজ মোডিফায়ার, সংকলকটির একটি ইঙ্গিত যা পরে উল্লেখ করা চিহ্নটি সংজ্ঞায়িত করা হয় (ইঙ্গিতটি "এখানে নয়")।
আমি যদি লিখি
extern int i;
কোনও সি ফাইলে ফাইল স্কোপে (কোনও ফাংশন ব্লকের বাইরে), তারপরে আপনি বলছেন "ভেরিয়েবলটি অন্য কোথাও সংজ্ঞায়িত করা যেতে পারে"।
extern int f() {return 0;}
উভয়ই হ'ল ফাংশনটির ঘোষণা এবং এফ-এর একটি সংজ্ঞা। এক্ষেত্রে সংজ্ঞাটি বাহ্যিক অংশটিকে ওভার রাইড করে।
extern int f();
int f() {return 0;}
সংজ্ঞাটি অনুসরণ করে প্রথমে একটি ঘোষণা।
externআপনি যদি একটি ফাইল স্কোপ ভেরিয়েবল ঘোষণা করতে এবং একই সাথে সংজ্ঞায়িত করতে চান তবে এর ব্যবহার ভুল। উদাহরণ স্বরূপ,
extern int i = 4;
সংকলকটির উপর নির্ভর করে একটি ত্রুটি বা সতর্কতা দেবে।
externআপনি যদি সুস্পষ্টভাবে কোনও ভেরিয়েবলের সংজ্ঞা এড়াতে চান তবে এর ব্যবহার দরকারী।
আমাকে ব্যাখ্যা করতে দাও:
ধরা যাক ফাইল এসি-তে রয়েছে:
#include "a.h"
int i = 2;
int f() { i++; return i;}
আহ ফাইলের মধ্যে রয়েছে:
extern int i;
int f(void);
এবং বিসি ফাইল রয়েছে:
#include <stdio.h>
#include "a.h"
int main(void){
printf("%d\n", f());
return 0;
}
শিরোনামের বাহ্যিকটি দরকারী, কারণ এটি লিঙ্ক ফেজ চলাকালীন সংকলককে বলে, "এটি একটি ঘোষণা, কোনও সংজ্ঞা নয়"। আমি যদি এসি-র রেখাটি সরিয়ে ফেলি যা আমি সংজ্ঞায়িত করে, এর জন্য স্থান বরাদ্দ করে এবং এর জন্য একটি মান নির্ধারণ করে, প্রোগ্রামটি একটি অপরিজ্ঞাত রেফারেন্স সহ সংকলন করতে ব্যর্থ হবে। এটি বিকাশকারীকে বলে যে সে একটি পরিবর্তনশীল উল্লেখ করেছে তবে এখনও এটি সংজ্ঞায়িত হয়নি। অন্যদিকে, আমি "বাহ্যিক" কীওয়ার্ডটি বাদ দিয়েছি এবং int i = 2লাইনটি সরিয়ে দিই , প্রোগ্রামটি এখনও সংকলন করে - আমি 0 এর একটি ডিফল্ট মান দিয়ে সংজ্ঞায়িত করব।
ফাইল স্কোপ ভেরিয়েবলগুলি 0 বা NULL এর একটি ডিফল্ট মান দিয়ে স্পষ্টভাবে সংজ্ঞায়িত করা হয় যদি আপনি তাদের কাছে স্পষ্টভাবে কোনও মান নির্ধারণ না করেন - ব্লক-স্কোপ ভেরিয়েবলের বিপরীতে যা আপনি কোনও ফাংশনের শীর্ষে ঘোষণা করেন। বাহ্যিক কীওয়ার্ডটি এই অন্তর্নিহিত সংজ্ঞাটিকে এড়িয়ে চলে এবং এভাবে ভুল এড়াতে সহায়তা করে।
ফাংশনগুলির জন্য, ফাংশন ঘোষণায়, কীওয়ার্ডটি সত্যই অপ্রয়োজনীয়। ফাংশন ঘোষণার অন্তর্নিহিত সংজ্ঞা নেই।