2012-02-20 15 views
5

Zobacz tło w tle jako this question.Jak nakazać kompilatorowi wygenerowanie aliasu dla funkcji wirtualnej?

Zasadniczo mam następującą definicję klasy

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

Czy istnieje sposób, aby poinstruować kompilator generuje dwa symbole, które są rozpoznawane jako foo4? To znaczy, chcę, aby plik wykonywalny poprosił dynamicznego linkera o rozstrzygnięcie _ZN7MyClass4foo4Edi (symbol dla MyClass::foo4(double, int)) i jakiegoś innego symbolu (powiedzmy _ZN7MyClass9reserved1Ev, symbolu dla MyClass::reserved1()), dynamiczny linker rozstrzygnie zarówno na &MyClass::foo4(double, int). Używam dość nowoczesnego GCC na Linux.

+1

Tylko dla kompletności wywodu (jest to w komentarzu skoro pytasz o GCC i Linux), w VC++ można to zrobić przy użyciu pragma: http: // nikoniko-programming.blogspot.com/2010/09/aliasing-symbol-names-during-link-time.html – Asaf

Odpowiedz

1

W C++ wygląda to tak:

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

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

Należy pamiętać, że obie odpowiedzi mają założenia dotyczące mangowania nazw, które mogą się zmieniać czasami, gdy GCC zmieni wersję. –

3

W gcc użyj "alias" attribute.

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

... ale wierzę, że to będzie działać tylko w tym samym pliku jako obiektu (a) definicji symbolu, więc nie jestem pewien, że będzie odpowiadał naszym przypadków zastosowań: patrz here. W szczególności będzie to alias dla jednej wersji wywołania wirtualnego i nie będzie dziedziczony przez podklasy; dodatkowo nie można go użyć do aliasu słabego symbolu.

Powiązane problemy