কম্পিউটার টিউটোরিয়াল

C++-এ নাম मैंگلিং (Name Mangling) এবং extern "C"


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

নোট: কম্পাইলারের উপর নির্ভর করে ফলাফল ভিন্ন হতে পারে।


  1. C++-এ নেমস্পেস (Namespace)

  2. C++-এ delete() এবং free()

  3. C++ এবং C#-এর পার্থক্য

  4. C++ এবং C#-এ Foreach লুপ