Pregunta

Estoy tratando de aprender y comprender renombrado de nombres en C ++. Aquí hay algunas preguntas:

(1) De DevX

Cuando se sobrecarga una función global, el nombre revuelto generado para cada versión sobrecargada es único. Renombrado de nombres también se aplica a las variables. Por lo tanto, una variable local y una variable global con el mismo nombre que el usuario todavía obtener los nombres alterados distintos.

¿Hay otros ejemplos que utilizan el nombre mangling, además de la sobrecarga de funciones y variables del mismo nombre global y local?

(2) De Wiki

Se plantea la necesidad de que la lengua permite que diferentes entidades para ser nombrado con el mismo identificador, siempre y cuando que ocupan un espacio de nombres diferente (en un espacio de nombres se define típicamente por un módulo, clase o Directiva espacio de nombres explícito).

Yo no entiendo muy bien por qué el nombre mangling solamente se aplica a los casos en que los identificadores pertenecen a diferentes espacios de nombres, ya que las funciones sobrecarga puede estar en el mismo espacio de nombres y el mismo nombre de variables globales y locales también pueden estar en el mismo espacio . ¿Cómo entender esto?

variables de Do con mismo nombre pero en diferentes ámbitos también el nombre de uso mangling?

(3) ¿C tienen renombrado de nombres? Si no es así, ¿cómo puede lidiar con el caso cuando algunas variables globales y locales tienen el mismo nombre? C no tiene la sobrecarga de funciones, ¿verdad?

Gracias y saludos!

¿Fue útil?

Solución

C no hace renombrado de nombres, aunque sí pre-Pend un subrayado a los nombres de funciones, por lo que el printf(3) es en realidad _printf en el objeto libc.

En C ++ la historia es diferente. La historia de ella es que originalmente creado BS "C con clases" o cfront , un compilador que se traduciría principios de C ++ a C. Luego resto de las herramientas - C compilador y enlazador que se utiliza para producir código objeto. Esto implicaba que los nombres de C ++ tenían que ser traducidos a C nombres de alguna manera. Esto es exactamente lo que nombre mangling hace. Proporciona un nombre único para cada miembro de la clase y la función global / espacio de nombres y variable, por lo que los nombres de espacio de nombres y de clase (por resolución) y tipos de argumentos (por sobrecarga) de alguna manera están incluidas en los nombres de engarce final.

Esto es muy fácil de ver con herramientas como nm(1) - compilar el código C ++ y mirar los símbolos generados. El siguiente es en OSX con GCC:

namespace zoom
{
    void boom( const std::string& s )
    {
        throw std::runtime_error( s );
    }
}

~$ nm a.out | grep boom
0000000100001873 T __ZN4zoom4boomERKSs

En tanto las variables locales (automático) C ++ C y no producen símbolos, pero en vivo en los registros o en la pila.

Editar:

Las variables locales no tienen nombres de archivo que resulta objeto de la mera razón de que enlazador no necesita saber acerca de ellos. Así que sin nombre, sin mangling. Todo lo demás (que enlazador tiene que mirar) es el nombre-destrozado en C ++.

Otros consejos

Autonombrado es simplemente la forma en que el compilador mantiene el enlazador feliz.

En C, no se puede tener dos funciones con el mismo nombre, no importa qué. Así que eso es lo que el enlazador se preparó para asumir: nombres únicos. (Usted puede tener funciones estáticas en diferentes unidades de compilación, porque sus nombres no son de interés para el enlazador.)

En C ++, puede tener dos funciones con el mismo nombre que siempre que tengan diferentes tipos de parámetros. Así C ++ cosechadoras el nombre de función con los tipos de alguna manera. De esa manera el enlazador los ve como tener diferentes nombres.

Tenga en cuenta que no importa cómo el nombre se ha mezclado, y de hecho cada compilador hace de manera diferente. Lo que importa es que cada función con el mismo nombre base es de alguna manera hizo único para el enlazador.

Se puede ver ahora que la adición de espacios de nombres y plantillas para la mezcla mantiene extender el principio.

Técnicamente, se trata de "decorar". Suena menos crudo, sino también mangling tipo de CreditInterest implica que podría se recolocan en IntCrederestit mientras que lo que realmente ocurre es más como _CreditInterest@4 que es, justo decir, "decorada" más destrozado. Dicho esto, yo lo llamo mangling también :-) pero encontrará más información técnica y los ejemplos, si se busca "C ++ decoración de nombres".

¿Hay otros ejemplos que utilizan el nombre mangling, además de la sobrecarga de funciones y variables del mismo nombre global y local?

mangles C ++ todos símbolos, siempre. Es más fácil para el compilador. Normalmente, la codifica mangling algo acerca de la lista de parámetros o tipos, ya que son las causas más comunes de planchado de ser necesario.

C no mangle. De alcance se utiliza para controlar el acceso a las variables locales y globales del mismo nombre.

Fuente: http: //sickprogrammersarea.blogspot. en / 2014/03 / entrevista-técnico-preguntas-en-c_6.html

Nombre mangling es el proceso utilizado por los compiladores de C ++ dar a cada función en su programa un nombre único. En C ++, en general, los programas tienen por lo menos-un par de funciones con el mismo nombre. Por lo tanto nombrar mangling puede ser considerado como un aspecto importante en C ++.

Ejemplo: Comúnmente, los nombres de los miembros se generan de forma única mediante la concatenación del nombre del miembro con la de la clase, por ejemplo, dada la declaración:

class Class1
 {
        public:
            int val;
            ...
  };

val se convierte en algo como:

  // a possible member name mangling
 val__11Class1

agner tiene más información sobre lo que es un nombre mangling y cómo se hace en diferentes compiladores.

Nombre mangling (también llamado nombre de decoración) es un método utilizado por C ++ compiladores para añadir información adicional a los nombres de las funciones y Los objetos en archivos objeto. Esta información es utilizada por enlazadores cuando una función o un objeto definido en un módulo es referenciado desde otro módulo. Nombre mangling sirve para lo siguiente:

  1. Hacer posible que los enlazadores para distinguir entre diferentes versiones de las funciones sobrecargadas.
  2. Hacer posible que los enlazadores para comprobar que los objetos y funciones se declaran exactamente de la misma manera en todos los módulos.
  3. Hacer posible que los enlazadores para dar información completa sobre el tipo de referencias no resueltas en los mensajes de error.

Nombre mangling se inventó para cumplir con el propósito 1. Los otros fines son beneficios secundarios no totalmente soportados por todos los compiladores. los información mínima que debe suministrarse para una función es el nombre de la función y los tipos de todos sus parámetros, así como cualquier clase o espacio de nombres calificadores. Información adicional posible incluye el tipo de retorno, el convenio de llamada, etc. Todo esto la información se codifica en una sola cadena de texto ASCII que se parece críptica para el observador humano. El enlazador no tiene que saber qué este medio de código con el fin de cumplir con el propósito 1 y 2. Sólo se necesita comprobar si las cadenas son idénticas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top