বাহ্যিক "C" কীওয়ার্ডটি C++-এ একটি ফাংশনের নাম তৈরি করতে ব্যবহৃত হয় যাতে C লিঙ্কেজ থাকে। এই ক্ষেত্রে কম্পাইলার ফাংশন ম্যাঙ্গেল না. আসুন প্রথমে দেখি C++ এ ম্যাঙ্গলিং কি, তারপর আমরা বাহ্যিক “C” কীওয়ার্ড সম্পর্কে আলোচনা করতে পারি।
C++ এ আমরা ফাংশন ওভারলোডিং বৈশিষ্ট্য ব্যবহার করতে পারি। এই বৈশিষ্ট্যটি ব্যবহার করে, আমরা একই নামের ফাংশন তৈরি করতে পারি। পার্থক্য হল আর্গুমেন্টের ধরন এবং আর্গুমেন্টের সংখ্যা। রিটার্ন টাইপ এখানে বিবেচনা করা হয় না. এখন প্রশ্ন আসে কিভাবে C++ অবজেক্ট কোডে ওভারলোডেড ফাংশনকে আলাদা করে?
অবজেক্ট কোডে, এটি আর্গুমেন্ট সম্পর্কে তথ্য যোগ করে নাম পরিবর্তন করে। এখানে যে কৌশলটি প্রয়োগ করা হয় তাকে নাম ম্যাংলিং বলা হয়। C++ নামের কোনো প্রমিত কৌশল নেই। তাই বিভিন্ন কম্পাইলার বিভিন্ন কৌশল ব্যবহার করে।
এখানে Name Mangling এর একটি উদাহরণ। ওভারলোড করা ফাংশনগুলির নাম দেওয়া হয়েছে func(), এবং আরেকটি ফাংশন my_function() আছে৷
উদাহরণ
int func(int x) { return x*x; } double func(double x) { return x*x; } void my_function(void) { int x = func(2); //integer double y = func(2.58); //double }
কিছু C++ কম্পাইলার নিচের মত পরিবর্তন করবে −
উদাহরণ
int __func_i(int x){ return x*x; } double __func_d(double x){ return x*x; } void __my_function_v(void){ int x = __func_i(2); //integer double y = __func_d(2.58); //double }
C ফাংশন ওভারলোডিং সমর্থন করে না, তাই আমাদের নিশ্চিত করতে হবে যে একটি চিহ্নের নাম পরিবর্তন করা হয় না, যখন আমরা C++ এ একটি C কোড লিঙ্ক করি। নিম্নলিখিত C++ কোডটি একটি ত্রুটি তৈরি করবে।
উদাহরণ
int printf(const char *format,...); main() { printf("Hello World"); }
আউটপুট
undefined reference to `printf(char const*, ...)' ld returned 1 exit status
এই সমস্যাটি তৈরি হচ্ছে কারণ printf() এর নাম কম্পাইলার দ্বারা পরিবর্তন করা হয়েছে। এবং এটি আপডেট করা printf() ফাংশনের সংজ্ঞা খুঁজে পায় না। এই সমস্যাটি কাটিয়ে উঠতে, আমাদের C++-এ বাহ্যিক "C" ব্যবহার করতে হবে। যখন এই ব্লকের ভিতরে কিছু কোড ব্যবহার করা হয়, তখন C++ কম্পাইলার নিশ্চিত করে যে ফাংশনের নামটি অসংলগ্ন। তাই নাম পরিবর্তন করা হবে না। তাই এই সমস্যা সমাধানের জন্য উপরের কোডটি এরকম হবে।
উদাহরণ
extern "C"{ int printf(const char *format,...); } main() { printf("Hello World"); }
আউটপুট
Hello World
দ্রষ্টব্য: কোডের এই ব্লকগুলি বিভিন্ন কম্পাইলারে বিভিন্ন ফলাফল তৈরি করতে পারে।
সুতরাং বাহ্যিক "সি" মূলত একটি লিঙ্কেজ স্পেসিফিকেশন। প্রতিটি কম্পাইলারে, সি লিঙ্কেজ নির্দিষ্ট করতে আমাদের এই কীওয়ার্ডটি ব্যবহার করতে হবে। এবং আরেকটি জিনিস আমাদের মনে রাখতে হবে যে লিঙ্কেজ স্পেসিফিকেশন অবশ্যই নেমস্পেস স্কোপে থাকতে হবে। ক্লাসের সদস্যদের বহিরাগত “C”
থেকে উপেক্ষা করা হয়