Descripción de decoración de nombres de C++

Seleccione idioma Seleccione idioma
Id. de artículo: 126845 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Los compiladores de Microsoft C++ codifican los nombres de símbolos en programas de C++ para incluir información de tipo en el nombre. Esto se denomina "la decoración de nombres" o "mutilación de nombres". El propósito de esto es garantizar la vinculación de seguridad de tipos. El lenguaje C++ permite la sobrecarga de funciones donde funciones con el mismo nombre se sólo distinguen entre sí por los tipos de datos de los argumentos a las funciones. Decoración de nombres permite al vinculador que distinguir entre diferentes versiones de las funciones sobrecargadas, porque los nombres de las funciones se codifica o representativos de forma diferente.

Más información

Los proveedores de compilador diferentes tienen sus propios algoritmos para la decoración de nombres o métodos. Microsoft no publica el algoritmo que sus compiladores utilizar para la decoración de nombres porque pueden cambiar en el futuro. Sin embargo, a veces es necesario obtener la versión de un nombre de función decorada. Por ejemplo, deberá exportar una función C++ desde un archivo DLL de Windows con una lista en la sección EXPORTS de un archivo .def utilizado para generar la DLL. (Aunque declarar que la función con __declspec (dllexport) es el método preferido para exportar una función de C++ utilizando Visual C++, edición de 32 bits, es aún válido utilizar un archivo .def con estos productos.) Para exportar la función correctamente, deberá mostrar su nombre decorado, no el nombre en el código fuente.

Para todos los productos enumerados anteriormente, Microsoft realiza Kits de herramientas del explorador disponible. Estos kits de herramientas proporcionan funciones que pueden interpretar nombres representativos.

Para obtener más información acerca de __declspec (dllexport), haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
132044Utilizar _declspec (dllimport) y _declspec(dllexport) en código
En el siguiente ejemplo de código utiliza la función FormatDName en la biblioteca de explorador, parte de la Browser Toolkit. Para descargar Browser Toolkit, visite el siguiente sitio Web de Microsoft:
http://www.microsoft.com/downloads/details.aspx?FamilyID=621ae185-1c2a-4d6b-8146-183d66fe709d&displaylang=en
La función devuelve la forma no decorada del nombre que se ha pasado.

Código de ejemplo

   /* Compile options needed: cl /AL getname.cpp bthunkl.obj /link bsc.lib
          (for 16-bit, where getname.cpp is the source file name)
                              cl getname.cpp /link bsc.lib
          (for 32-bit version 4.x and earlier, where getname.cpp is the source
           file name)
   */ 

   #include <iostream.h>
   #include <strstrea.h>

   extern "C"
   {
   #include "hungary.h"
   #include "bsc.h"
   #include "bscsup.h"
   }

   void main( int argc, char *argv[] )
   {
       if ( argc < 2 )
       {
           cout << "Usage: GETNAME decorated-name" << endl;
           return;
       }

       strstream name;

       // Call browser library function to get undecorated name
       name << FormatDname ( argv[1] ) << '\0';

       cout << "Undecorated name: " << name.str() << endl;
       name.rdbuf()->freeze( 0 );
   }
				
El ejemplo siguiente funciona con la versión más reciente de explorador Toolkit 5.0 y Visual C++ 5.0.
   /* Compile options needed: cl /GX getname.cpp /link msbsc50.lib
          (where getname.cpp is the source file name)
   */ 

   #include <iostream>
   #include <strstream>
   #include <windows.h>
   #include "bsc.h"

   using namespace std;

   int main( int argc, char *argv[] )
   {
       Bsc* pbsc;

       if ( argc < 3 )
       {
           cout << "Usage: GETNAME bscfile-name decorated-name" << endl;
           return 1;
       }

       strstream name;

       // Open the browser file
       Bsc::open( argv[1], &pbsc );

       // Call browser library function to get undecorated name
       name << pbsc->formatDname( argv[2] ) << '\0';

       cout << "Undecorated name: " << name.str() << endl;
       name.rdbuf()->freeze( 0 );

       pbsc->close();
       return 0;
   }
				

Propiedades

Id. de artículo: 126845 - Última revisión: jueves, 1 de septiembre de 2005 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palabras clave: 
kbmt kbcode kbcompiler kbcpponly kbinfo KB126845 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 126845

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com