Düzenlenmiş adlar

C ve C++ programlarındaki işlevler, veriler ve nesneler, iç olarak dekore edilmiş adlarıyla temsil edilir. Süslü ad , derleyici tarafından bir nesne, veri veya işlev tanımı derlemesi sırasında oluşturulan kodlanmış bir dizedir. Çağırma kurallarını, türlerini, işlev parametrelerini ve diğer bilgileri adla birlikte kaydeder. Ad düzenlemesi olarak da bilinen bu ad dekorasyonu, bağlayıcının yürütülebilir dosyayı bağlarken doğru işlevleri ve nesneleri bulmasına yardımcı olur.

Dekore edilmiş adlandırma kuralları Visual Studio'nun çeşitli sürümlerinde değişmiştir ve farklı hedef mimarilerde de farklı olabilir. Visual Studio kullanılarak oluşturulan kaynak dosyalara doğru şekilde bağlanmak için, C ve C++ DLL'leri ve kitaplıkları aynı derleyici araç takımı, bayraklar ve hedef mimari kullanılarak derlenmelidir.

Dekont

Visual Studio 2015 veya üzeri tarafından oluşturulan kitaplıklar, Visual Studio 2022 aracılığıyla Visual Studio'nun sonraki sürümleriyle oluşturulmuş uygulamalar tarafından kullanılabilir. Daha fazla bilgi için bkz . Visual Studio sürümleri arasında C++ ikili uyumluluğu.

Süslü adlar kullanma

Normalde, başarıyla derlenen ve bağlanan kodu yazmak için süslü adı bilmeniz gerekmez. Dekore edilmiş adlar, derleyici ve bağlayıcının iç uygulama ayrıntılarıdır. Araçlar genellikle adı sıralanmamış biçimde işleyebilir. Ancak, bağlayıcıya ve diğer araçlara bir işlev adı belirttiğinizde bazen süslü bir ad gerekir. Örneğin, aşırı yüklenmiş C++ işlevlerini, ad alanlarının üyelerini, sınıf oluşturucularını, yıkıcıları ve özel üye işlevlerini eşleştirmek için, süslü adı belirtmeniz gerekir. Seçenek bayrakları ve süslü adlar gerektiren diğer durumlar hakkında ayrıntılı bilgi için, kullandığınız araçlar ve seçeneklere ilişkin belgelere bakın.

İşlev adını, sınıfını, çağırma kuralını, dönüş türünü veya herhangi bir parametreyi değiştirirseniz, süslü ad da değişir. Bu durumda, yeni dekore edilmiş adı almanız ve süslü adın belirtildiği her yerde kullanmanız gerekir.

Diğer programlama dillerinde yazılmış koda bağlanırken veya diğer derleyiciler kullanılırken ad dekorasyonu da önemlidir. Farklı derleyiciler farklı ad düzenleme kuralları kullanır. Yürütülebilir dosyanız başka bir dilde yazılmış koda bağlandığında, dışarı aktarılan ve içeri aktarılan adlarla çağırma kurallarıyla eşleşmesi için özel özen gösterilmelidir. Derleme dili kodu, MSVC kullanılarak yazılmış kaynak koduna bağlanmak için MSVC tarafından düzenlenmiş adları ve çağırma kurallarını kullanmalıdır.

C++ ile dekore edilmiş bir adın biçimi

C++ işlevinin süslü adı aşağıdaki bilgileri içerir:

  • İşlev adı.

  • üye işleviyse işlevin üyesi olduğu sınıf. Dekorasyon, işlevi içeren sınıfı kapsayan sınıfı içerebilir ve bu şekilde devam eder.

  • bir ad alanının parçasıysa işlevin ait olduğu ad alanı.

  • İşlev parametrelerinin türleri.

  • Çağırma kuralı.

  • İşlevin dönüş türü.

  • İsteğe bağlı hedefe özgü öğe. ARM64EC nesnelerde, ada bir $$h etiket eklenir.

İşlev ve sınıf adları, dekore edilmiş adla kodlanır. Dekore edilmiş adın geri kalanı, yalnızca derleyici ve bağlayıcı için iç anlamı olan bir koddur. Aşağıda, sıralanmamış ve dekore edilmiş C++ adları örnekleri verilmiştir.

Sıralanmamış ad Süslü ad
int a(char){int i=3;return i;}; ?a@@YAHD@Z
void __stdcall b::c(float){}; ?c@b@@AAGXM@Z

C ile dekore edilmiş bir adın biçimi

C işlevinin dekorasyon biçimi, aşağıdaki tabloda gösterildiği gibi bildiriminde kullanılan çağırma kuralına bağlıdır. Ayrıca, C++ kodunun bağlantı olduğu bildirildiğinde extern "C" kullanılan dekorasyon biçimidir. Varsayılan çağırma kuralıdır __cdecl. 64 bitlik bir ortamda C veya extern "C" işlevleri yalnızca çağırma kuralı kullanılırken __vectorcall dekore edilir.

Çağırma kuralı Dekorasyon
__cdecl Öndeki alt çizgi (_)
__stdcall Baştaki alt çizgi (_) ve sonunda işareti (@) ve ardından parametre listesindeki bayt sayısı ondalık olarak gösterilir
__fastcall Baştaki ve sondaki işaretler (@) ve ardından parametre listesindeki bayt sayısını temsil eden ondalık bir sayı
__vectorcall İki sondaki işaret (@@) ve ardından parametre listesinde ondalık bayt sayısı

C bağlantısına sahip ARM64EC işlevleri için (C olarak derlenmiş veya kullanılarak extern "C") bir # , süslü ada eklenir.

Süslü adları görüntüleme

Verileri, nesneyi, işlev tanımını veya prototipini içeren kaynak dosyayı derledikten sonra simge adının düzenlenmiş biçimini alabilirsiniz. Programınızdaki süslü adları incelemek için aşağıdaki yöntemlerden birini kullanabilirsiniz:

Düzenlenmiş adları görüntülemek için bir döküm kullanmak için

  1. (Listeleme dosya türü) derleyici seçeneği kaynak kodla (/FAs) derleme olarak ayarlanmış veri, nesne veya işlev tanımını veya prototipi /FA içeren kaynak dosyayı derleyerek bir döküm oluşturun.

    Örneğin, bir geliştirici komut istemine girerek cl /c /FAs example.cpp bir listeleme dosyası example.asmoluşturun.

  2. Sonuçta elde edilen liste dosyasında, noktalı virgülle PUBLIC (;) başlayıp biten ve ardından düzeltilmemiş veriler veya işlev adı içeren satırı bulun. ve noktalı virgül arasındaki PUBLIC simge, süslü addır.

Düzenlenmiş adları görüntülemek için DUMPBIN kullanmak için

  1. Dışarı aktarılan simgeleri bir OBJ veya LIB dosyasında görmek için geliştirici komut istemine girin dumpbin /exports <obj-or-lib-file> .

  2. Simgenin süslü biçimini bulmak için, ayraç içinde sıralanmamış adı arayın. Dekore edilmiş ad, aynı satırda, sıralanmamış addan önce yer alır.

Sıralanmamış adları görüntüleme

Undname.exe dosyasını kullanarak dekore edilmiş bir adı sıralanmamış biçimine dönüştürebilirsiniz. Bu örnekte nasıl çalıştığı gösterilmektedir:

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)"

Ayrıca bkz.

Ek MSVC derleme araçları
Bağlantı belirtmek için kullanma extern