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

См. этот вопрос для фона.

В принципе, у меня есть следующее определение класса

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)


В С++ это выглядит так:

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