C++-এ ফাংশন ওভারলোডিং সাপোর্ট করার জন্য কম্পাইলার ফাংশন নাম ম্যাংگل (mangle) করে - আর্গুমেন্ট টাইপ ইনফো যোগ করে। C ভাষা ওভারলোডিং সাপোর্ট করে না, তাই নাম পরিবর্তন হয় না। C++-এ C লাইব্রেরি কল করার জন্য নাম ম্যাংgling বন্ধ করতে extern "C" ব্যবহার করা হয়।
নেম ম্যাংgling উদাহরণ
int func(int x) { return x*x; }
double func(double x) { return x*x; }
// কম্পাইলার এটি রূপান্তর করতে পারে:
int __func_i(int x) { return x*x; }
double __func_d(double x) { return x*x; }
প্রব্লেম: C ফাংশন কল
int printf(const char* format, ...); // C ফাংশন
int main() { printf("Hello"); } // Linker error: mangled name not found
সমাধান: extern "C"
extern "C" {
int printf(const char* format, ...); // নাম ম্যাংল হবে না
}
int main() { printf("Hello World"); } // OK
আউটপুট
Hello World
নियम
extern "C"ব্লকের ভেতরের ফাংশন/ভেরিয়েবল C লিঙ্কেজ পায় (নো ম্যাংgling)।- নেমস্পেস স্কোপেই ব্যবহার করতে হয় (ক্লাস মেম্বার নয়)।
- ক্লাস মেম্বার ফাংশনে
extern "C"প্রয়োগ করা যায় না (ইগনোর হয়)। - হেডার ফাইলে ব্যবহার করলে
#ifdef __cplusplusগার্ড দিন।
হেডার ফাইলে সঠিক প্যাটার্ন
// mylib.h
#ifdef __cplusplus
extern "C" {
#endif
void c_function(int x);
#ifdef __cplusplus
}
#endif
নোট: এটি লিংকেজ স্পেসিফিকেশন, টাইপ চেকিং নয়। C++ কম্পাইলার C কোড কম্পাইল করছে না, শুধু নাম 그대로 রেখে লিংকিংয়ে সাহায্য করছে।