.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "C++FILT 1" .TH C++FILT 1 2026-08-31 binutils-2.47 "GNU Development Tools" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" c++filt \- رمزگشایی و بازگردانی نمادهای C++ و Java (demangle) .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" c++filt [\fB\-_\fR|\fB\-\-strip\-underscore\fR] [\fB\-n\fR|\fB\-\-no\-strip\-underscore\fR] [\fB\-p\fR|\fB\-\-no\-params\fR] [\fB\-t\fR|\fB\-\-types\fR] [\fB\-i\fR|\fB\-\-no\-verbose\fR] [\fB\-r\fR|\fB\-\-no\-recurse\-limit\fR] [\fB\-R\fR|\fB\-\-recurse\-limit\fR] [\fB\-s\fR \fIformat\fR|\fB\-\-format=\fR\fIformat\fR] [\fB\-\-help\fR] [\fB\-\-version\fR] [\fIsymbol\fR...] .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" زبان‌های C++ و Java قابلیت بارگذاری بیش‌ازحد توابع (function overloading) را ارائه می‌دهند؛ بدین معنا که می‌توانید توابع متعددی با نام یکسان بنویسید، به این شرط که هر تابع پارامترهایی با انواع مختلف دریافت کند. زبان‌های C++ و Java برای این‌که بتوانند این توابع با نام‌های مشابه را از یکدیگر تشخیص دهند، آن‌ها را به یک نام سطح پایین در اسمبلی کدگذاری می‌کنند که هر نسخهٔ متمایز را به‌طور یکتا مشخص می‌سازد. این فرایند با عنوان \fImangling\fR (درهم‌سازی) شناخته می‌شود. برنامهٔ \&\fBc++filt\fR [1] نگاشت معکوس را انجام می‌دهد: این برنامه نام‌های سطح پایین را به نام‌های سطح کاربر رمزگشایی (\fIdemangle\fR) می‌کند تا برای انسان قابل خواندن باشند. .PP هر کلمهٔ الفبایی\-عددی (شامل حروف، ارقام، زیرخط‌ها، علامت‌های دلار یا نقطه‌ها) که در ورودی دیده شود، یک نام درهم‌ریختهٔ بالقوه در نظر گرفته می‌شود. اگر نام به یک نام C++ رمزگشایی شود، نام C++ در خروجی جایگزین نام سطح پایین می‌شود، در غیر این صورت همان کلمهٔ اصلی به خروجی فرستاده می‌شود. به این ترتیب می‌توانید یک فایل کد منبع اسمبلیِ کامل را که شامل نام‌های درهم‌ریخته است، از طریق \fBc++filt\fR عبور دهید و همان فایل منبع را حاوی نام‌های رمزگشایی‌شده (demangled) دریافت کنید. .PP شما همچنین می‌توانید با ارسال نمادها از طریق خط فرمان، از \fBc++filt\fR برای رمزگشایی نمادهای مجزا استفاده کنید: .PP .Vb 1 \& c++filt .Ve .PP اگر هیچ آرگومان \fIsymbol\fR مشخص نشود، \fBc++filt\fR به‌جای آن نام نمادها را از ورودی استاندارد می‌خواند. همهٔ نتایج روی خروجی استاندارد چاپ می‌شوند. تفاوت میان خواندن نام‌ها از خط فرمان در مقایسه با خواندن نام‌ها از ورودی استاندارد این است که در خط فرمان انتظار می‌رود آرگومان‌ها فقط نام‌های درهم‌ریخته باشند و هیچ بررسی برای تفکیک آن‌ها از متن‌های اطراف انجام نمی‌شود. بنابراین به عنوان مثال: .PP .Vb 1 \& c++filt \-n _Z1fv .Ve .PP کار خواهد کرد و نام را به "f()" رمزگشایی می‌کند، در حالی که: .PP .Vb 1 \& c++filt \-n _Z1fv, .Ve .PP کار نخواهد کرد. (به کامای اضافه در انتهای نام درهم‌ریخته توجه کنید که باعث نامعتبر شدن آن می‌شود). با این حال، دستور زیر کار خواهد کرد: .PP .Vb 1 \& echo _Z1fv, | c++filt \-n .Ve .PP و مقدار "f()," را نمایش خواهد داد؛ یعنی نام رمزگشایی‌شده به همراه کامایی که در انتهای آن قرار دارد. دلیل این رفتار آن است که هنگام خواندن نام‌ها از ورودی استاندارد، این انتظار وجود دارد که ممکن است بخشی از یک فایل منبع اسمبلی باشند که شاید نویسه‌های اضافی و متفرقه‌ای پس از یک نام درهم‌ریخته در آن وجود داشته باشد. برای مثال: .PP .Vb 1 \& .type _Z1fv, @function .Ve.SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP \fB\-_\fR 4 .IX Item "-_" .PD 0 .IP \fB\-\-strip\-underscore\fR 4 .IX Item "--strip-underscore" .PD در برخی سامانه‌ها، هم کامپایلر C و هم ++C یک زیرخط (underscore) پیش از هر نام قرار می‌دهند. برای نمونه، نام C با عنوان \f(CW\*(C`foo\*(C'\fR نام سطح‌پایین \f(CW\*(C`_foo\*(C'\fR را می‌گیرد. این گزینه زیرخط آغازین را حذف می‌کند. این که آیا \&\fBc++filt\fR به‌طور پیش‌فرض زیرخط را حذف می‌کند یا خیر، به معماری مقصد وابسته است. .IP \fB\-n\fR 4 .IX Item "-n" .PD 0 .IP \fB\-\-no\-strip\-underscore\fR 4 .IX Item "--no-strip-underscore" .PD زیرخط آغازین را حذف نکن. .IP \fB\-p\fR 4 .IX Item "-p" .PD 0 .IP \fB\-\-no\-params\fR 4 .IX Item "--no-params" .PD هنگام بازگردانی نام یک تابع (demangling)، انواع دادهٔ پارامترهای تابع را نمایش نده. .IP \fB\-t\fR 4 .IX Item "-t" .PD 0 .IP \fB\-\-types\fR 4 .IX Item "--types" .PD تلاش برای بازگردانی انواع (types) افزون بر نام توابع. این گزینه به‌طور پیش‌فرض غیرفعال است زیرا انواع درهم‌ریخته (mangled) معمولاً تنها به صورت درونی در کامپایلر استفاده می‌شوند و ممکن است با نام‌های درهم‌ریخته‌نشده اشتباه گرفته شوند. برای نمونه، تابعی با نام "a" اگر به عنوان نام یک نوعِ درهم‌ریخته در نظر گرفته شود، به "signed char" بازگردانی خواهد شد. .IP \fB\-i\fR 4 .IX Item "-i" .PD 0 .IP \fB\-\-no\-verbose\fR 4 .IX Item "--no-verbose" .PD جزئیات پیاده‌سازی (در صورت وجود) را در خروجیِ بازگردانی‌شده قرار نده. .IP \fB\-r\fR 4 .IX Item "-r" .PD 0 .IP \fB\-R\fR 4 .IX Item "-R" .IP \fB\-\-recurse\-limit\fR 4 .IX Item "--recurse-limit" .IP \fB\-\-no\-recurse\-limit\fR 4 .IX Item "--no-recurse-limit" .IP \fB\-\-recursion\-limit\fR 4 .IX Item "--recursion-limit" .IP \fB\-\-no\-recursion\-limit\fR 4 .IX Item "--no-recursion-limit" .PD محدودیت میزان بازگشت (recursion) انجام‌شده هنگام بازگردانی رشته‌ها را فعال یا غیرفعال می‌کند. از آنجا که قالب‌های درهم‌ریزی نام، سطحی نامحدود از بازگشت را مجاز می‌دانند، امکان ایجاد رشته‌هایی وجود دارد که رمزگشایی آن‌ها تمام فضای پشتهٔ (stack) موجود در ماشین میزبان را مصرف کرده و باعث بروز خطای حافظه (memory fault) شود. این محدودیت با تحدید عمق بازگشت به ۲۰۴۸ سطح تودرتو، سعی می‌کند از رخ دادن این اتفاق جلوگیری کند. .Sp حالت پیش‌فرض فعال بودن این محدودیت است، اما غیرفعال کردن آن ممکن است برای بازگردانی نام‌های واقعاً پیچیده لازم باشد. با این حال توجه داشته باشید که در صورت غیرفعال کردن محدودیت بازگشت، سرریز شدن و اتمام پشته محتمل است و هرگونه گزارش باگ دربارهٔ چنین پیشامدی رد خواهد شد. .Sp گزینهٔ \fB\-r\fR مترادفی برای گزینهٔ \&\fB\-\-no\-recurse\-limit\fR است. گزینهٔ \fB\-R\fR مترادفی برای گزینهٔ \fB\-\-recurse\-limit\fR است. .IP "\fB\-s\fR \fIformat\fR" 4 .IX Item "-s format" .PD 0 .IP \fB\-\-format=\fR\fIformat\fR 4 .IX Item "--format=format" .PD ابزار \&\fBc++filt\fR می‌تواند روش‌های گوناگون درهم‌ریزی را که توسط کامپایلرهای مختلف استفاده می‌شوند رمزگشایی کند. آرگومان داده‌شده به این گزینه مشخص می‌کند از کدام روش استفاده شود: .RS 4 .ie n .IP """auto""" 4 .el .IP \f(CWauto\fR 4 .IX Item "auto" انتخاب خودکار بر پایهٔ فایل اجرایی (روش پیش‌فرض) .ie n .IP """gnu""" 4 .el .IP \f(CWgnu\fR 4 .IX Item "gnu" روش مورد استفاده در کامپایلر GNU C++ (یا g++) .ie n .IP """lucid""" 4 .el .IP \f(CWlucid\fR 4 .IX Item "lucid" روش مورد استفاده در کامپایلر Lucid (یا lcc) .ie n .IP """arm""" 4 .el .IP \f(CWarm\fR 4 .IX Item "arm" روش تعیین‌شده توسط راهنمای حاشیه‌نویسی‌شدهٔ C++ (C++ Annotated Reference Manual) .ie n .IP """hp""" 4 .el .IP \f(CWhp\fR 4 .IX Item "hp" روش مورد استفاده در کامپایلر HP (یا aCC) .ie n .IP """edg""" 4 .el .IP \f(CWedg\fR 4 .IX Item "edg" روش مورد استفاده در کامپایلر EDG .ie n .IP """gnu\-v3""" 4 .el .IP \f(CWgnu\-v3\fR 4 .IX Item "gnu-v3" روش مورد استفاده در کامپایلر GNU C++ (یا g++) با V3 ABI. .ie n .IP """java""" 4 .el .IP \f(CWjava\fR 4 .IX Item "java" روش مورد استفاده در کامپایلر GNU Java (یا gcj) .ie n .IP """gnat""" 4 .el .IP \f(CWgnat\fR 4 .IX Item "gnat" روش مورد استفاده در کامپایلر GNU Ada (یا GNAT). .RE .RS 4 .RE .IP \fB\-\-help\fR 4 .IX Item "--help" خلاصه‌ای از گزینه‌های \fBc++filt\fR را چاپ کرده و خارج می‌شود. .IP \fB\-\-version\fR 4 .IX Item "--version" شماره نسخهٔ \fBc++filt\fR را چاپ کرده و خارج می‌شود. .IP \fB@\fR\fIfile\fR 4 .IX Item "@file" گزینه‌های خط فرمان را از \fIfile\fR می‌خواند. گزینه‌های خوانده‌شده به جای گزینهٔ اصلی @\fIfile\fR جایگزین می‌شوند. اگر \fIfile\fR وجود نداشته باشد یا خواندنی نباشد، با آن گزینه به صورت لفظی برخورد شده و حذف نخواهد شد. .Sp گزینه‌ها در \fIfile\fR با نویسه‌های فاصله خالی (whitespace) از یکدیگر جدا می‌شوند. یک نویسهٔ فاصله می‌تواند با قرار گرفتن کل گزینه درون علامت‌های نقل‌قول تکی یا دوتایی، در گزینه گنجانده شود. هر نویسه‌ای (از جمله بک‌اسلش) می‌تواند با پیشوند کردن یک بک‌اسلش به آن نویسه وارد شود. خود \fIfile\fR نیز می‌تواند شامل گزینه‌های @\fIfile\fR بیشتری باشد؛ چنین گزینه‌هایی به صورت بازگشتی پردازش خواهند شد..SH "پاورقی‌ها (FOOTNOTES)" .IX Header "FOOTNOTES" .IP 1. 4 سیستم‌عامل MS\-DOS اجازهٔ استفاده از نویسهٔ \f(CW\*(C`+\*(C'\fR را در نام فایل‌ها نمی‌دهد، بنابراین در MS\-DOS این برنامه \fBCXXFILT\fR نامیده می‌شود. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" مدخل‌های Info برای \fIbinutils\fR. .SH "کپی‌رایت و تکثیر (COPYRIGHT)" .IX Header "COPYRIGHT" Copyright (c) 1991\-2026 Free Software Foundation, Inc. .PP اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ متأخر دیگری که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، داده می‌شود؛ بدون بخش‌های تغییرناپذیر، بدون متن‌های روی جلد و بدون متن‌های پشت جلد. یک نسخه از این مجوز در بخشی با عنوان «GNU Free Documentation License» گنجانده شده است.