Noms décorés

Les fonctions, les données et les objets dans les programmes C et C++ sont représentés en interne par leurs noms décorés. Un nom décoré est une chaîne encodée créée par le compilateur lors de la compilation d’un objet, de données ou d’une définition de fonction. Il enregistre les conventions d'appel, les types, les paramètres de fonction et d'autres informations avec le nom. Cette décoration de nom, également appelée mangling de nom, aide l’éditeur de liens à trouver les fonctions et objets appropriés lors de la liaison d’un exécutable.

Les conventions d’affectation de noms décorées ont changé dans différentes versions de Visual Studio et peuvent également être différentes sur différentes architectures cibles. Pour établir une liaison correcte avec les fichiers sources créés à l’aide de Visual Studio, C et C++ dll et bibliothèques doivent être compilés à l’aide du même ensemble d’outils de compilateur, des indicateurs et de la même architecture cible.

Remarque

Les bibliothèques créées par Visual Studio 2015 ou version ultérieure peuvent être consommées par les applications créées avec des versions ultérieures de Visual Studio via Visual Studio 2022. Pour plus d’informations, consultez la compatibilité binaire C++ entre les versions de Visual Studio.

Utilisation de noms décorés

Normalement, vous n'êtes pas tenu de connaître le nom décoré pour écrire du code pouvant être compilé et créer des liens avec succès. Les noms décorés sont un détail d'implémentation interne au compilateur et à l'éditeur de liens. Les outils peuvent habituellement gérer le nom dans sa forme non décorée. Cependant, un nom décoré est parfois nécessaire lorsque vous spécifiez un nom de fonction à l'éditeur de liens et à d'autres outils. Par exemple, pour faire correspondre des fonctions C++ surchargées, des membres d'espaces de noms, des constructeurs de classe, des destructeurs et des fonctions membres spéciales, vous devez spécifier le nom décoré. Pour plus d’informations sur les indicateurs d’option et d’autres situations qui nécessitent des noms décorés, consultez la documentation relative aux outils et options que vous utilisez.

Si vous modifiez le nom de la fonction, la classe, la convention d'appel, le type de retour ou n'importe quel paramètre, le nom décoré change également. Dans ce cas, vous devez obtenir le nouveau nom décoré et l'utiliser partout où le nom décoré est spécifié.

La décoration des noms est également importante lors de la liaison à du code écrit dans d'autres langages de programmation ou à l'aide d'autres compilateurs. Des compilateurs différents utilisent des conventions différentes de décoration des noms. Quand votre fichier exécutable est lié à du code écrit dans un autre langage, il convient d’apporter un soin particulier pour mettre en correspondance les noms exportés et importés et les conventions d’appel. Le code du langage d’assembly doit utiliser les noms décorés MSVC et les conventions d’appel pour lier le code source écrit à l’aide de MSVC.

Format d’un nom décoré C++

Un nom décoré pour une fonction C++ contient les informations suivantes :

  • Nom de la fonction.

  • Classe dont la fonction est membre, s’il s’agit d’une fonction membre. La décoration peut inclure la classe qui entoure la classe qui contient la fonction, et ainsi de suite.

  • Espace de noms auquel appartient la fonction, si elle fait partie d’un espace de noms.

  • Types des paramètres de la fonction.

  • Convention d’appel.

  • Type de retour de la fonction.

  • Élément facultatif spécifique à la cible. Dans ARM64EC objets, une $$h balise est insérée dans le nom.

Les noms de fonction et de classe sont encodés dans le nom décoré. Le reste du nom décoré est un code qui a une signification interne uniquement pour le compilateur et l'éditeur de liens. Voici quelques exemples de noms C++ non décorés et décorés.

Nom non décoré Nom décoré
int a(char){int i=3;return i;}; ?a@@YAHD@Z
void __stdcall b::c(float){}; ?c@b@@AAGXM@Z

Format d’un nom décoré C

La forme de la décoration pour une fonction C dépend de la convention d’appel utilisée dans sa déclaration, comme l’indique le tableau suivant. Il s’agit également du format de décoration utilisé lorsque le code C++ est déclaré avoir extern "C" une liaison. La convention d’appel par défaut est __cdecl. Dans un environnement 64 bits, C ou extern "C" les fonctions sont décorées uniquement lors de l’utilisation de la convention d’appel __vectorcall .

Convention d'appel Décoration
__cdecl Trait de soulignement de début (_)
__stdcall Trait de soulignement de début (_) et fin au signe (@) suivi du nombre d’octets dans la liste de paramètres en décimal
__fastcall Début et fin des signes (@) suivis d’un nombre décimal représentant le nombre d’octets dans la liste de paramètres
__vectorcall Deux signes de fin (@@) suivis d’un nombre décimal d’octets dans la liste de paramètres

Pour ARM64EC fonctions avec liaison C (compilées en tant que C ou à l’aide extern "C"), une # valeur est ajoutée au nom décoré.

Afficher les noms décorés

Vous pouvez obtenir la forme décorée du nom d'un symbole après avoir compilé le fichier source qui contient la définition ou le prototype des données, de l'objet ou de la fonction. Pour examiner les noms décorés dans votre programme, vous pouvez utiliser l'une des méthodes suivantes :

Pour utiliser un listing pour afficher les noms décorés

  1. Générez une liste en compilez le fichier source qui contient les données, l’objet ou la définition de fonction ou le prototype avec l’option /FA du compilateur (Type de fichier Listing) définie sur assembly avec le code source (/FAs).

    Par exemple, entrez cl /c /FAs example.cpp à l’invite de commandes du développeur pour générer un fichier de référencement. example.asm

  2. Dans le fichier de référencement résultant, recherchez la ligne qui commence par PUBLIC et termine un point-virgule (;) suivi du nom de la fonction ou des données non décorées. Le symbole entre PUBLIC et le point-virgule est le nom décoré.

Pour utiliser DUMPBIN pour afficher les noms décorés

  1. Pour afficher les symboles exportés dans un fichier OBJ ou LIB, entrez à dumpbin /exports <obj-or-lib-file> l’invite de commandes du développeur.

  2. Pour trouver la forme décorée d'un symbole, recherchez le nom non décoré entre parenthèses. Le nom décoré se trouve sur la même ligne, avant le nom non décoré.

Affichage des noms non classés

Vous pouvez utiliser undname.exe pour convertir un nom décoré vers sa forme non décorée. Cet exemple montre comment cela fonctionne :

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

Voir aussi

Outils de build MSVC supplémentaires
Utilisation extern pour spécifier la liaison