Как поручить компилятору генерировать псевдоним для виртуальной функции? - PullRequest
5 голосов
/ 20 февраля 2012

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

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

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

... но я считаю, что это будет работать только в том же объектном файле, что и (a) определение символа, поэтому я не уверен, что он подойдет для ваших случаев использования: см. здесь . В частности, это будет псевдоним только для одной версии виртуального вызова и не будет наследоваться подклассами; кроме того, вы не можете использовать его для обозначения слабого символа.

1 голос
/ 20 февраля 2012

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

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

int MyClass::foo4(double d, int i)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...