2012-02-20 5 views
5

Ver this question para el fondo.¿Cómo se le ordena al compilador que genere un alias para una función virtual?

Básicamente, tienen la siguiente definición de una clase

class MyClass { 
    virtual int foo4(double, int); 
}; 

¿Hay una manera de dar instrucciones al compilador para generar dos símbolos que resolverían a foo4? Es decir, quiero que si un ejecutable solicita que el enlazador dinámico resuelva _ZN7MyClass4foo4Edi (símbolo para MyClass::foo4(double, int)) y algún otro símbolo (digamos _ZN7MyClass9reserved1Ev, un símbolo para MyClass::reserved1()), el enlazador dinámico se resolverá en &MyClass::foo4(double, int). Estoy usando GCC bastante moderno en Linux.

+1

Sólo por el bien de la integridad (está en un comentario ya que preguntas acerca de GCC y Linux), en VC++ puede hacerlo utilizando pragmas: http: // nikoniko-programming.blogspot.com/2010/09/aliasing-symbol-names-during-link-time.html – Asaf

Respuesta

1

En C++ que tiene el siguiente aspecto:

class MyClass { 
    int foo5(double, int) __attribute__((alias("_ZN7MyClass4foo4Edi"))); 
    virtual int foo4(double, int); 
}; 

int MyClass::foo4(double d, int i) 
{ 
} 
+1

Tenga en cuenta que ambas respuestas tienen suposiciones sobre el cambio de nombre, que puede cambiar ocasionalmente cuando GCC cambia la versión. –

3

En gcc, use "alias" attribute.

int reserved1() __attribute__((alias ("_ZN7MyClass4foo4Edi"))); 

... pero creo que esto sólo funcionará en el mismo archivo de objeto como (a) la definición del símbolo, así que no estoy seguro de que se adapte a sus casos de uso: ver here. Específicamente, solo será un alias para una versión de la llamada virtual y no será heredado por subclases; Además, no puede usarlo para alias un símbolo débil.

Cuestiones relacionadas