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

How to instruct the compiler to generate an alias for a virtual function?

本文关键字:函数 虚拟 别名 编译器 何指示 指示      更新时间:2023-10-16

有关背景信息,请参阅此问题。

基本上,我对类有以下定义

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

有没有一种方法可以指示编译器生成两个解析为foo4的符号?也就是说,我希望如果一个可执行文件要求动态链接器解析_ZN7MyClass4foo4EdiMyClass::foo4(double, int)的符号)和其他一些符号(比如_ZN7MyClass9reserved1EvMyClass::reserved1()的符号),那么动态链接器会将两者都解析为&MyClass::foo4(double, int)。我在Linux上使用相当现代的GCC。

在gcc中,使用"alias"属性。

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

但我相信这只适用于与(a)符号定义相同的对象文件,所以我不确定它是否适合您的用例:请参阅此处。具体来说,它将只是虚拟调用的一个版本的别名,不会被子类继承;此外,您不能使用它来对弱符号进行别名。

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

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