Rumah >pembangunan bahagian belakang >C++ >Mengapakah nama fungsi yang dieksport C DLL kadangkala dihiasi, dan bagaimanakah saya boleh mengeksport nama yang tidak dihias?
Eksport C DLL: Nama Berhias/Mangled
Dalam pembangunan C DLL, nama fungsi yang dieksport dijangka kelihatan tidak dihias selepas penyusunan. Walau bagaimanapun, menemui nama fungsi yang dihias dengan aksara tambahan mungkin menimbulkan kebimbangan.
Punca Hiasan
Hiasan yang dilihat adalah hasil daripada proses pencabulan nama pengkompil. Apabila menyusun kod C, pengkompil mengubah suai nama fungsi untuk memastikan keunikan merentas fungsi terlampau beban atau unit kompilasi yang berbeza. Mangling ini termasuk aksara dan simbol tambahan.
Penyelesaian Menggunakan Komen Pragma
Untuk mengeksport nama fungsi yang tidak dihias, tanpa menggunakan fail definisi modul, ulasan pragma boleh dimasukkan:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Sebagai alternatif, untuk mendapatkan nama fungsi yang dihias secara automatik:
#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
Equivalent Extern "C" dengan Declaration Specifier
Satu lagi pendekatan ialah menggunakan extern "C" dengan deklarasi specifier:
extern "C" void __declspec(dllexport) SomeFunction();
Bagaimanapun, kaedah ini masih menghasilkan fungsi berhias yang sama nama.
Menghapuskan Postfix
Malangnya, hiasan siaran "=" tidak boleh dihapuskan tanpa menggunakan fail definisi modul atau ulasan pragma. Postfix ini menunjukkan versi berhias fungsi.
Penyelesaian untuk Aplikasi C#
Walaupun nama yang tidak dihias lebih diutamakan, panggilan P/Invoke dalam C# masih boleh dibuat menggunakan nama fungsi yang dihias. Untuk berbuat demikian, masukkan nama yang dihias sepenuhnya apabila menggunakan fungsi tersebut.
Atas ialah kandungan terperinci Mengapakah nama fungsi yang dieksport C DLL kadangkala dihiasi, dan bagaimanakah saya boleh mengeksport nama yang tidak dihias?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!