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

c++filt - بازگردانی نام نمادهای درهم‌ریخته (demangle) زبان‌های ++C و Java

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 یک زیرخط (_) در ابتدای هر نام قرار می‌دهند. برای نمونه، نام C با عنوان "foo" نام سطح پایین "_foo" را دریافت می‌کند. این گزینه زیرخط آغازین را حذف می‌کند. اینکه آیا c++filt به طور پیش‌فرض زیرخط را حذف می‌کند یا خیر، وابسته به معماری هدف است.
زیرخط آغازین را حذف نکن.
هنگام بازگردانی نام یک تابع، انواع پارامترهای تابع را نمایش نده.
تلاش برای بازگردانی انواع داده‌ها علاوه بر نام توابع. این گزینه به طور پیش‌فرض غیرفعال است زیرا انواع داده‌های درهم‌ریخته معمولاً فقط به صورت درونی در کامپایلر استفاده می‌شوند و ممکن است با نام‌های درهم‌ریخته‌نشده اشتباه گرفته شوند. برای نمونه، تابعی به نام "a" اگر به عنوان یک نام نوع داده درهم‌ریخته در نظر گرفته شود، به "signed char" تبدیل می‌شود.
جزئیات پیاده‌سازی (در صورت وجود) را در خروجی بازگردانی‌شده نگنجان.
محدودیت میزان بازگشت (recursion) انجام‌شده هنگام بازگردانی رشته‌ها را فعال یا غیرفعال می‌کند. از آنجا که قالب‌های درهم‌ریزی نام امکان سطح نامحدودی از بازگشت را فراهم می‌کنند، ممکن است رشته‌هایی ایجاد شوند که رمزگشایی آن‌ها فضای پشته موجود در رایانه میزبان را به اتمام رسانده و خطای حافظه ایجاد کند. این محدودیت تلاش می‌کند با محدود کردن بازگشت به ۲۰۴۸ سطح تودرتو، از وقوع این مسئله جلوگیری کند.

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

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

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

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

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

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

Copyright (c) 1991-2026 Free Software Foundation, Inc.

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

2026-07-30 binutils-2.47