C++FILT(1) GNU Development Tools C++FILT(1)

i686-w64-mingw32-c++filt - بازگردانی نام‌های درهم‌ریخته (Demangle) نمادهای C++ و Java برای MinGW-w64

c++filt [-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-r|--no-recurse-limit]
[-R|--recurse-limit]
[-s format|--format=format]
[--help] [--version] [symbol...]

زبان‌های C++ و Java قابلیت سربارگذاری توابع (Function Overloading) را ارائه می‌دهند؛ بدین معنا که می‌توانید توابع متعددی با نام یکسان بنویسید، به شرطی که هر تابع پارامترهایی از انواع مختلف دریافت کند. زبان‌های C++ و Java برای تشخیص این توابع هم‌نام، آن‌ها را به یک نام سطح پایین در زبان اسمبلی تبدیل (کدگذاری) می‌کنند که هر نسخه متفاوت را به طور منحصر‌به‌فرد مشخص می‌سازد. این فرآیند به عنوان درهم‌ریزی نام‌ها (Mangling) شناخته می‌شود. برنامه c++filt [1] نگاشت معکوس را انجام می‌دهد: این برنامه نام‌های سطح پایین را رمزگشایی (بازگردانی یا Demangle) کرده و به نام‌های سطح کاربر تبدیل می‌کند تا خوانا و قابل فهم باشند.

هر کلمه حرفی‌عددی (شامل حروف، ارقام، زیرخط‌ها، علامت دلار یا نقطه) که در ورودی دیده شود، یک نام درهم‌ریخته بالقوه در نظر گرفته می‌شود. اگر این نام به یک نام C++ رمزگشایی شود، نام C++ جایگزین نام سطح پایین در خروجی خواهد شد؛ در غیر این صورت همان کلمه اصلی چاپ می‌شود. بدین ترتیب می‌توانید یک فایل منبع کامل اسمبلی را که حاوی نام‌های درهم‌ریخته است از طریق c++filt عبور دهید و همان فایل منبع را با نام‌های بازگردانی‌شده دریافت کنید.

همچنین می‌توانید برای رمزگشایی نمادهای تکی، آن‌ها را مستقیماً در خط فرمان به c++filt ارسال نمایید:

c++filt <symbol>

اگر هیچ آرگومان symbol مشخص نشود، c++filt نام‌های نماد را از ورودی استاندارد می‌خواند. تمام نتایج در خروجی استاندارد چاپ می‌شوند. تفاوت خواندن نام‌ها از خط فرمان با ورودی استاندارد این است که در آرگومان‌های خط فرمان انتظار می‌رود تنها نام درهم‌ریخته ارائه شود و هیچ بررسی برای جداسازی آن از متن اطراف انجام نمی‌شود. بنابراین به عنوان مثال:

c++filt -n _Z1fv

کار کرده و نام را به "f()" بازمی‌گرداند، در حالی که:

c++filt -n _Z1fv,

کار نخواهد کرد. (به ویرگول اضافه در انتهای نام درهم‌ریخته توجه کنید که باعث نامعتبر شدن آن می‌شود). اما این دستور کار خواهد کرد:

echo _Z1fv, | c++filt -n

و مقدار "f()," را نمایش می‌دهد، یعنی همان نام بازگردانی‌شده به همراه ویرگول انتهایی. این رفتار به این دلیل است که هنگام خواندن نام‌ها از ورودی استاندارد، انتظار می‌رود بخشی از یک فایل منبع اسمبلی باشند که ممکن است نویسه‌های اضافی در انتهای نام درهم‌ریخته وجود داشته باشد. برای مثال:

.type   _Z1fv, @function

-_
در برخی سیستم‌ها، کامپایلرهای C و C++ یک زیرخط (_) در ابتدای هر نام قرار می‌دهند. برای مثال، نام "foo" در زبان C به نام سطح پایین "_foo" تبدیل می‌شود. این گزینه زیرخط ابتدایی را حذف می‌کند. این که آیا c++filt به طور پیش‌فرض زیرخط را حذف کند یا خیر، به معماری مقصد بستگی دارد.
زیرخط ابتدایی را حذف نکن.
هنگام بازگردانی نام یک تابع، انواع پارامترهای آن را نمایش نده.
تلاش برای بازگردانی انواع داده‌ها (Types) در کنار نام توابع. این قابلیت به طور پیش‌فرض غیرفعال است زیرا انواع داده‌های درهم‌ریخته معمولاً فقط درون کامپایلر استفاده می‌شوند و ممکن است با نام‌های عادی اشتباه گرفته شوند. برای مثال، تابعی به نام "a" در صورت تفسیر به عنوان یک نوع داده درهم‌ریخته، به "signed char" تبدیل می‌شود.
جزئیات پیاده‌سازی (در صورت وجود) را در خروجی بازگردانی‌شده نگنجان.
فعال یا غیرفعال کردن محدودیت بر میزان بازگشت (Recursion) هنگام بازگردانی رشته‌ها. از آن‌جا که قالب‌های درهم‌ریزی نام اجازه سطح بازگشت نامحدود را می‌دهند، ممکن است رشته‌هایی تولید شوند که رمزگشایی آن‌ها تمام فضای پشته (Stack) ماشین میزبان را مصرف کرده و باعث خطای حافظه (Memory Fault) شود. این محدودیت با محدود کردن بازگشت به ۲۰۴۸ سطح تودرتو از بروز این مشکل جلوگیری می‌کند.

به طور پیش‌فرض این محدودیت فعال است، اما برای بازگردانی نام‌های واقعاً پیچیده ممکن است غیرفعال کردن آن ضروری باشد. توجه داشته باشید که در صورت غیرفعال کردن محدودیت بازگشت، اتمام حافظه پشته محتمل است و هرگونه گزارش باگ در این زمینه پذیرفته نخواهد شد.

گزینه -r معادل گزینه --no-recurse-limit است. گزینه -R معادل گزینه --recurse-limit است.

برنامه c++filt می‌تواند روش‌های مختلف درهم‌ریزی استفاده‌شده توسط کامپایلرهای گوناگون را رمزگشایی کند. آرگومان این گزینه روش مورد استفاده را انتخاب می‌کند:
"auto"
انتخاب خودکار بر اساس فایل اجرایی (روش پیش‌فرض)
"gnu"
روش استفاده‌شده توسط کامپایلر C++ گنو (g++)
"lucid"
روش استفاده‌شده توسط کامپایلر Lucid (lcc)
"arm"
روش مشخص‌شده در راهنمای مرجع C++ Annotated
"hp"
روش استفاده‌شده توسط کامپایلر HP (aCC)
"edg"
روش استفاده‌شده توسط کامپایلر EDG
"gnu-v3"
روش استفاده‌شده توسط کامپایلر C++ گنو (g++) با V3 ABI.
"java"
روش استفاده‌شده توسط کامپایلر Java گنو (gcj)
"gnat"
روش استفاده‌شده توسط کامپایلر Ada گنو (GNAT).
نمایش خلاصه‌ای از گزینه‌های c++filt و خروج.
نمایش شماره نسخه c++filt و خروج.
@file
خواندن گزینه‌های خط فرمان از file. گزینه‌های خوانده‌شده به جای گزینه اصلی @file جایگزین می‌شوند. اگر file وجود نداشته باشد یا خوانده نشود، گزینه به صورت لغوی بررسی شده و حذف نمی‌شود.

گزینه‌ها در file با نویسه‌های فاصله سفید جدا می‌شوند. می‌توان یک نویسه فاصله سفید را با قرار دادن کل گزینه در داخل علامت نقل قول تکی یا دوتایی درج کرد. هر نویسه‌ای (از جمله ممیز وارونه یا بک‌اسلش) را می‌توان با افزودن پیشوند ممیز وارونه به عنوان بخشی از گزینه گنجاند. خود file نیز ممکن است شامل گزینه‌های اضافی @file باشد؛ این گزینه‌ها به صورت بازگشتی پردازش خواهند شد.

1.
سیستم‌عامل MS-DOS اجازه استفاده از نویسه "+" را در نام فایل‌ها نمی‌دهد، بنابراین در MS-DOS نام این برنامه CXXFILT است.

مدخل‌های Info برای binutils.

حق نشر © 1991-2026 Free Software Foundation, Inc.

مجوز کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز اسناد آزاد گنو (GNU Free Documentation License)، نسخه 1.3 یا هر نسخه متأخر دیگر منتشر شده توسط بنیاد نرم‌افزار آزاد اعطا می‌شود؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد و بدون متون پشت جلد. یک نسخه از این مجوز در بخش با عنوان "GNU Free Documentation License" گنجانده شده است.

2026-08-03 binutils-2.47