View Full Version : سوال: Name Mangling چیه؟
feri88
شنبه 05 تیر 1389, 10:31 صبح
سلام
من می خوام مفهوم دقیق name mangling و نحوه استفاده از اون در برنامه نویسی رو بدونم.
توضیحات موجود در ویکی پدیا و msdn رو خوندم، ولی هنوز نحوه عملکرد و استفاده از اون رو در برنامه نویسی یا کتابخونه ها خوب نفهمیدم!
دوست دارم یه نفر که از این مفهوم استفاده کرده و در این زمینه تجربه داره، با زبون ساده و در صورت امکان کامل اون رو بهم توضیح بده.
ممنون میشم اگر این لطف رو بکنید.
Mehdi Asgari
شنبه 05 تیر 1389, 13:42 عصر
Name Mangling یا Name Declaration به فرایند تغییر سمبول ها و اسم های موجود در برنامه برای تمییز دادن اون ها (هنگام کامپایل) گفته میشه. در C++ ما می تونیم توابع هم نام ولی متفاوت (overloaded) داشته باشیم؛ همینطور می تونیم اسامی مشابه در کلاس ها و namespace های مختلف داشته باشیم. برای این که Linker بتونه بین این موجودات تفاوت قائل بشه ، نیاز داره که هر کدوم رو به صورت یکتا بهش بشناسونیم (به همراه اطلاعات اضافی تری مثل تعداد و سایز آرگومان ها)
این موضوع در استاندارد زبان نیومده ، بنابراین هر کامپایلری از روش خودش استفاده می کنه (البته ما در اینجا دربارۀ Microsoft C/C++ صحبت می کنیم)
برای جزییات بیشتر به اینجا مراجعه کن: http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling
من یه مثال اینجا می زنم (این مثال رو با Visual C++ 2008 تست کردم؛ ممکنه در نسخه های دیگه ، نتایج مختلفی بگیری)
فرض کن این 3 تابع رو داریم:
int Mehdi();
int Mehdi(int x);
int Mehdi(double d, char c);
تمام نام ها در C++ پس از mangled شدن ، با علامت سوال شروع میشن؛ تابع اول تبدیل میشه به
?Mehdi@@YAHXZ
یعنی تابعی global به اسم مهدی که export نشده و naming convention اون __cdecl هست و نوع برگشتی اون int هست. کد دو تابع بعد میشه
?Mehdi@@YAHH@Z
?Mehdi@@YAHND@Z
تابع دوم یک H اضافه داره (یعنی یک int به عنوان آرگومان)
تابع سوم یک N و یک D داره که به ترتیب نشانگر char و double هستن.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.