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 noms, aide l’éditeur de liens à trouver les fonctions et objets appropriés lors de la liaison d’un exécutable.

Les conventions de nommage décorées ont changé dans différentes versions de Visual Studio et peuvent également être différentes selon les architectures cibles. Pour établir un lien correct avec les fichiers sources créés à l’aide de Visual Studio, les DLL et bibliothèques DLL C et C++ doivent être compilées à l’aide du même ensemble d’outils du compilateur, des indicateurs et de l’architecture cible.

Notes

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 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 et les conventions d’appel MSVC pour établir un lien vers 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 les objets ARM64EC, 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é lié extern "C" . La convention d’appel par défaut est __cdecl. Dans un environnement 64 bits, les fonctions C ou extern "C" sont décorées uniquement lors de l’utilisation de la convention d’appel __vectorcall .

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

Pour les fonctions ARM64EC avec liaison C (qu’elles soient compilées en tant que C ou à l’aide extern "C"de ), un # est ajouté 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 compilant le fichier source qui contient les données, l’objet ou la définition de fonction ou le prototype avec l’option /FA de 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 liste, example.asm.

  2. Dans le fichier de liste résultant, recherchez la ligne qui commence PUBLIC par et se termine par un point-virgule (;), suivie 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é est sur la même ligne, avant le nom non décoré.

Affichage des noms non décoré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 de pour spécifier la liaison