Как да инструктирам компилатора да генерира псевдоним за виртуална функция?

Вижте този въпрос за предистория.

По принцип имам следната дефиниция на клас

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

Има ли начин да инструктирам компилатора да генерира два символа, които биха се разрешили на foo4? Тоест искам, ако изпълним файл поиска от динамичния линкер да разреши _ZN7MyClass4foo4Edi (символ за MyClass::foo4(double, int)) и някакъв друг символ (да кажем _ZN7MyClass9reserved1Ev, символ за MyClass::reserved1()), динамичният линкер да разреши и двата до &MyClass::foo4(double, int). Използвам доста модерен GCC на Linux.


person p12    schedule 20.02.2012    source източник
comment
Само за пълнота (това е в коментар, тъй като попитахте за GCC и linux), във VC++ можете да го направите с прагми: nikoniko-programming.blogspot.com/2010/09/   -  person Asaf    schedule 20.02.2012


Отговори (2)


В C++ изглежда така:

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

int MyClass::foo4(double d, int i)
{
}
person Richard Pennington    schedule 20.02.2012
comment
Имайте предвид, че и двата отговора имат предположения за манипулиране на имена, които могат да се променят от време на време, когато GCC промени версията. - person Marco van de Voort; 21.02.2012

В gcc използвайте атрибута "alias".

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

... но вярвам, че това ще работи само в същия обектен файл като (а) дефиниция на символа, така че не съм сигурен, че ще отговаря на вашите случаи на употреба: вижте тук. По-конкретно, това ще бъде само псевдоним за една версия на виртуалното повикване и няма да бъде наследено от подкласове; освен това не можете да го използвате за псевдоним на слаб символ.

person Borealid    schedule 20.02.2012