如何指示编译器为虚函数生成别名?

时间:2012-02-20 18:49:42

标签: c++ linux linker virtual abi

有关背景信息,请参阅this question

基本上,我有一个类

的以下定义
class  MyClass {
    virtual int foo4(double, int);
};

有没有办法指示编译器生成两个可以解析为foo4的符号?也就是说,如果可执行文件要求动态链接器解析_ZN7MyClass4foo4EdiMyClass::foo4(double, int)的符号)和其他符号(假设为_ZN7MyClass9reserved1Ev),我想要MyClass::reserved1()的符号}),动态链接器将解析为&MyClass::foo4(double, int)。我在Linux上使用相当现代的GCC。

2 个答案:

答案 0 :(得分:3)

在gcc中,使用"alias" attribute

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

...但我相信这只会在与(a)符号定义相同的目标文件中起作用,因此我不确定它是否适合您的使用案例:请参阅here。具体来说,它只是一个版本的虚拟调用的别名,并且不会被子类继承;另外,你不能用它来代替弱符号。

答案 1 :(得分:1)

在C ++中它看起来像这样:

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

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