2012-04-12 28 views
24

? Me pregunto por qué el uso de nombres nunca fue estandarizado por el estándar de C++. Evidentemente, tener diferentes algoritmos de creación de nombres perjudica la interoperabilidad [1] y no veo ninguna ventaja de tenerlo definido en la implementación.¿Por qué no se estandariza el nombre

Es decir, contrariamente a lo que ocurre con las convenciones de llamada o el tamaño de las primitivas, a la máquina en sí no le importa ni sabe cómo se llama a la función. Entonces, ¿por qué no estaba estandarizado y por qué aún no está estandarizado? Los compiladores han cambiado las reglas en el pasado de todas maneras entre versiones.

[1] todas las personas que exportan funciones como extern "C" hablan volúmenes.

+11

El uso de nombres estandarizados solo sirve para darle una falsa sensación de seguridad, porque también debe estandarizar la ABI para obtener la interoperabilidad adecuada. Y es poco probable que el comité de estándares de C++ esté en el negocio de estandarización ABI. –

+3

+1 @Raymond - mentir sobre la interoperabilidad es una mala noticia. Es como confiar en un comportamiento indefinido. Claro, * piensas * que funciona, pero realmente no funciona. –

+0

Es cierto, estar de acuerdo en un C++ ABI sería mucho más difícil que para C.Ligeramente OT: ¿Qué exactamente en esta pregunta no se considera una buena opción para SO por 3 personas? Después de todo, existe claramente una buena respuesta distinta, como ya se ha demostrado. – Voo

Respuesta

19

La norma no aborda los detalles de implementación. Hay muchas, muchas cosas que dependen de la implementación, y que impiden que los programas funcionen juntos: cómo se organizan las clases, la estructura del vtable, etc. En general, los compiladores cambiarán el nombre si están dañados. cambiar cualquiera de estos. Esto es intencional, ya que impide que el código no funcione desde el enlace.

Es posible para una plataforma determinada definir un ABI de C++; todos los compiladores que se adhieran a él usarían implementaciones compatibles, y tendrían un nombre común . Este es un problema para los proveedores de plataforma, ; por las razones que sean, muy pocos proveedores han definido un C++ ABI.

Y la razón por la cual extern "C" funciona es porque casi todas las plataformas definen un C ABI.

+2

Debe agregarse que incluso si el proceso de mapeo fue estandarizado, 'extern" C "' sería necesario de todos modos, porque C no hace ningún cambio y C++ tiene que soportar funciones sobrecargadas, por lo que los símbolos son diferentes en cualquier caso. –

+3

@JanHudec No está realmente bien definido qué significa "extern" C "'. ¿Qué significa en una plataforma que no tiene un compilador de C, por ejemplo? En la práctica, sin embargo, la mayoría, si no todas las plataformas definen un C ABI, y 'extern "C" 'significa adherirse a eso. Y aquí, también, el nombre mangle no es el único problema; He trabajado en plataformas donde las variables de orden fueron empujadas a la pila, era diferente entre C y C++. (Además, la mayoría de los compiladores de C que utilicé modifican los nombres. Simplemente de una manera mucho más simple que C++). –

15

El estándar en realidad no requiere el cambio de nombre. En ese caso, el Estándar no requiere números de punto flotante IEEE, números enteros de complemento doble o cualquier cantidad de otras cosas.

hasta que hubo un generalizado ABI con el que podía confiar, GCC actually went out of its way to use a different name mangling scheme que sus competidores:

G ++ no hace mangling nombre de la misma manera como los compiladores de C++ otra. Esto significa que los archivos objeto compilados con un compilador no se pueden usar con otro.

Este efecto es intencional, para protegerlo de problemas más sutiles. Los compiladores difieren en cuanto a muchos detalles internos de la implementación de C++, incluidos: cómo se presentan las instancias de clase, cómo se implementa la herencia múltiple y cómo se manejan las llamadas a funciones virtuales. Si la codificación del nombre fuera la misma, sus programas se vincularían con las bibliotecas proporcionadas por otros compiladores, pero los programas se bloquearían cuando se ejecutaran. Las bibliotecas incompatibles luego se detectan en tiempo de enlace, en lugar de en tiempo de ejecución.

El mapeo de nombres también es más complejo de lo que muchos programadores creen. Por ejemplo, ¿cómo especificaría el estándar acceptable calling conventions for all platforms that C++ could run on? ¿Debería requerirse un sistema RISC para admitir x86 stdcall aunque los sistemas RISC usualmente pasan sus argumentos en registros en lugar de en la pila?

Cuestiones relacionadas