Bagikan melalui


Nama yang didekorasi

Fungsi, data, dan objek dalam program C dan C++ diwakili secara internal dengan nama yang didekorasi. Nama yang didekorasi adalah string yang dikodekan yang dibuat oleh pengkompilasi selama kompilasi definisi objek, data, atau fungsi. Ini merekam konvensi panggilan, jenis, parameter fungsi dan informasi lainnya bersama dengan nama. Dekorasi nama ini, juga dikenal sebagai nama mangling, membantu linker menemukan fungsi dan objek yang benar saat menautkan executable.

Konvensi penamaan yang didekorasi telah berubah dalam berbagai versi Visual Studio, dan juga dapat berbeda pada arsitektur target yang berbeda. Untuk menautkan dengan benar dengan file sumber yang dibuat dengan menggunakan VISUAL Studio, C dan C++ DLL dan pustaka harus dikompilasi dengan menggunakan toolset, bendera, dan arsitektur target kompilator yang sama.

Catatan

Pustaka yang dibangun oleh Visual Studio 2015 atau yang lebih baru dapat digunakan oleh aplikasi yang dibangun dengan versi Visual Studio yang lebih baru melalui Visual Studio 2022. Untuk informasi selengkapnya, lihat Kompatibilitas biner C++ antara versi Visual Studio.

Menggunakan nama yang didekorasi

Biasanya, Anda tidak perlu mengetahui nama yang didekorasi untuk menulis kode yang berhasil mengkompilasi dan menautkan. Nama yang didekorasi adalah detail implementasi internal untuk pengkompilasi dan linker. Alat biasanya dapat menangani nama dalam bentuk yang tidak terdekorasi. Namun, nama yang didekorasi terkadang diperlukan saat Anda menentukan nama fungsi ke linker dan alat lainnya. Misalnya, untuk mencocokkan fungsi C++ yang kelebihan beban, anggota namespace, konstruktor kelas, destruktor, dan fungsi anggota khusus, Anda harus menentukan nama yang didekorasi. Untuk detail tentang bendera opsi dan situasi lain yang memerlukan nama yang didekorasi, lihat dokumentasi untuk alat dan opsi yang Anda gunakan.

Jika Anda mengubah nama fungsi, kelas, konvensi panggilan, jenis pengembalian, atau parameter apa pun, nama yang didekorasi juga berubah. Dalam hal ini, Anda harus mendapatkan nama baru yang didekorasi dan menggunakannya di mana-mana nama yang didekorasi ditentukan.

Dekorasi nama juga penting saat menautkan ke kode yang ditulis dalam bahasa pemrograman lain atau menggunakan pengkompilasi lain. Kompilator yang berbeda menggunakan konvensi dekorasi nama yang berbeda. Ketika tautan yang dapat dieksekusi ke kode yang ditulis dalam bahasa lain, perawatan khusus harus dilakukan agar sesuai dengan nama dan konvensi panggilan yang diekspor dan diimpor. Kode bahasa assembly harus menggunakan nama yang didekorasi MSVC dan konvensi panggilan untuk menautkan ke kode sumber yang ditulis menggunakan MSVC.

Format nama yang dihiasi C++

Nama yang dihiasi untuk fungsi C++ berisi informasi berikut:

  • Nama fungsi.

  • Kelas tempat fungsi adalah anggota, jika itu adalah fungsi anggota. Dekorasi dapat mencakup kelas yang mencakup kelas yang berisi fungsi, dan sebagainya.

  • Namespace layanan milik fungsi, jika itu adalah bagian dari namespace layanan.

  • Jenis parameter fungsi.

  • Konvensi panggilan.

  • Jenis pengembalian fungsi.

  • Elemen khusus target opsional. Dalam objek ARM64EC, $$h tag disisipkan ke dalam nama.

Nama fungsi dan kelas dikodekan dalam nama yang didekorasi. Sisa nama yang didekorasi adalah kode yang memiliki arti internal hanya untuk pengkompilasi dan linker. Berikut ini adalah contoh nama C++ yang tidak terdekorasi dan didekorasi.

Nama tidak terdekorasi Nama yang didekorasi
int a(char){int i=3;return i;}; ?a@@YAHD@Z
void __stdcall b::c(float){}; ?c@b@@AAGXM@Z

Format nama yang didekorasi C

Bentuk dekorasi untuk fungsi C tergantung pada konvensi panggilan yang digunakan dalam deklarasinya, seperti yang ditunjukkan dalam tabel berikut. Ini juga format dekorasi yang digunakan ketika kode C++ dinyatakan memiliki extern "C" tautan. Konvensi panggilan default adalah __cdecl. Dalam lingkungan 64-bit, C atau extern "C" fungsi hanya dihiasi saat menggunakan __vectorcall konvensi panggilan.

Konvensi panggilan Hiasan
__cdecl Garis bawah terkemuka (_)
__stdcall Garis bawah depan (_) dan tanda di akhir (@) diikuti dengan jumlah byte dalam daftar parameter dalam desimal
__fastcall Tanda awal dan berikutnya (@) diikuti dengan angka desimal yang menunjukkan jumlah byte dalam daftar parameter
__vectorcall Dua tanda berikutnya (@@) diikuti oleh jumlah desimal byte dalam daftar parameter

Untuk fungsi ARM64EC dengan tautan C (baik dikompilasi sebagai C atau dengan menggunakan extern "C"), ditambahkan # ke nama yang didekorasi.

Menampilkan nama yang didekorasi

Anda bisa mendapatkan bentuk nama simbol yang dihiasi setelah mengkompilasi file sumber yang berisi data, objek, atau definisi fungsi atau prototipe. Untuk memeriksa nama yang didekorasi dalam program, Anda dapat menggunakan salah satu metode berikut:

Untuk menggunakan daftar untuk melihat nama yang didekorasi

  1. Buat daftar dengan mengkompilasi file sumber yang berisi data, objek, atau definisi fungsi atau prototipe dengan /FA opsi pengkompilasi (Jenis file daftar) diatur ke rakitan dengan kode sumber (/FAs).

    Misalnya, masukkan cl /c /FAs example.cpp di prompt perintah pengembang untuk membuat file daftar, example.asm.

  2. Dalam file daftar yang dihasilkan, temukan baris yang dimulai dengan PUBLIC dan berakhir titik koma (;) diikuti dengan data atau nama fungsi yang tidak terdekodekorasi. Simbol antara PUBLIC dan titik koma adalah nama yang didekorasi.

Untuk menggunakan DUMPBIN untuk melihat nama yang didekorasi

  1. Untuk melihat simbol yang diekspor dalam file OBJ atau LIB, masukkan dumpbin /exports <obj-or-lib-file> di prompt perintah pengembang.

  2. Untuk menemukan bentuk simbol yang didekorasi, cari nama yang tidak terdekorasi dalam tanda kurung. Nama yang didekorasi berada di baris yang sama, sebelum nama yang tidak didekorasi.

Menampilkan nama yang tidak terdekorasi

Anda dapat menggunakan undname.exe untuk mengonversi nama yang didekorasi ke formulir yang tidak terdekorasi. Contoh ini menunjukkan cara kerjanya:

C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"

Lihat juga

Alat build MSVC tambahan
Menggunakan extern untuk menentukan tautan