C++-এ ফাংশন ওভারলোডিং ফিচার আছে। একই নামের একাধিক ফাংশন বানানো যায়, শুধু আর্গুমেন্ট টাইপ বা সংখ্যা ভিন্ন হবে। রিটার্ন টাইপ বিবেচনা করা হয় না। অবজেক্ট কোডে C++ কীভাবে ওভারলোডেড ফাংশনগুলো আলাদা করে?
অবজেক্ট কোডে ফাংশনের নাম পরিবর্তন করে আর্গুমেন্টের তথ্য যোগ করা হয়। এই টেকনিককে নেম मैंگلিং (Name Mangling) বলা হয়। C++-এ নাম मैंگلিংর কোনো স্ট্যান্ডার্ড নেই, আলাদা কম্পাইলার আলাদা পদ্ধতি ব্যবহার করে।
উদাহরণ
int func(int x) { return x*x; }
double func(double x) { return x*x; }
void my_function(void) {
int x = func(2);
double y = func(2.58);
}
কিছু কম্পাইলার এটিকে নিচের মতো পরিবর্তন করে:
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);
double y = __func_d(2.58);
}
C-এ ফাংশন ওভারলোডিং নেই। তাই C কোড C++-এ লিংক করার সময় নিশ্চিত করতে হয় যে সিম্বলের নাম পরিবর্তন হয়নি। নিচের C++ কোড এরর দেবে:
int printf(const char *format,...);
int main() { printf("Hello World"); }
আউটপুট
undefined reference to `printf(char const*, ...)'
সমাধান: extern "C" ব্লক ব্যবহার করুন। এতে কম্পাইলার নিশ্চিত করে যে ফাংশন নাম পরিবর্তন হবে না।
extern "C" {
int printf(const char *format,...);
}
int main() { printf("Hello World"); }
আউটপুট
Hello World
নোট: কম্পাইলারের উপর নির্ভর করে ফলাফল ভিন্ন হতে পারে।