2012-02-20 11 views
5

Vedere this question per lo sfondo.Come istruire il compilatore a generare un alias per una funzione virtuale?

In sostanza, Ho la seguente definizione di una classe

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

Esiste un modo per indicare al compilatore di generare due simboli che avrebbero risolvere a foo4? Cioè, voglio che se un eseguibile richiede il linker dinamico per risolvere _ZN7MyClass4foo4Edi (simbolo per MyClass::foo4(double, int)) e qualche altro simbolo (diciamo _ZN7MyClass9reserved1Ev, un simbolo per MyClass::reserved1()), il linker dinamico si risolverebbe entrambi su &MyClass::foo4(double, int). Sto usando GCC abbastanza moderno su Linux.

+1

Solo per ragioni di completezza (è in un commento dal momento che hai chiesto di GCC e Linux), in VC++ è possibile farlo utilizzando pragma: http: // nikoniko-programming.blogspot.com/2010/09/aliasing-symbol-names-during-link-time.html – Asaf

risposta

1

In C++ che assomiglia a questo:

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

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

Nota che entrambe le risposte hanno supposizioni sul mangling del nome, che può cambiare occasionalmente quando GCC modifica la versione. –

3

In gcc, utilizzare "alias" attribute.

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

... ma credo che questo funziona solo nello stesso file oggetto come (a) la definizione del simbolo, quindi non sono sicuro che soddisfa le tue casi usi: vedi here. In particolare, sarà solo un alias per una versione della chiamata virtuale e non sarà ereditato da sottoclassi; Inoltre, non puoi usarlo per creare un alias di un simbolo debole.

Problemi correlati